[英]Get property value with Expression without knowing target type at compile time
我試圖創建一個表達式lambda來傳遞一個對象,然后獲取命名屬性return的值。 但是,僅在運行時才知道類型。
我從以下方法開始,以處理編譯時已知的類型:
private static Func<T, object> CreateExpression(string propertyName)
{
var arg = Expression.Parameter(typeof(T));
var expr = Expression.Property(arg, propertyName);
return Expression.Lambda<Func<T, object>>(expr, arg).Compile();
}
哪個完美。 但是,我需要更改它以處理僅在運行時已知的類型。
我應該可以這樣稱呼代表:
public object GetPropertyValue(object obj)
{
var propertyDelegate = GetDelegate(typeof(obj));
var propertyValue = propertyDelegate (obj);
return propertyValue;
}
private Func<object, object> GetDelegate(Type type)
{
// Lookup delegate in dictionary, or create if not existing
return CreateDelegate("MyProperty", type);
}
我嘗試從以前更改CreateDelegate,但不適用於Func<object, object>
:
Func<object,object> CreateDelegate(string propertyName, Type targetType)
{
var arg = Expression.Parameter(type);
var body = Expression.Property(arg, name);
var lambda = Expression.Lambda<Func<object,object>>(body, arg); //ArgumentException
return lambda.Compile();
}
它不接受Expresion.Parameter,因為它的類型為'targetType',而不是'object'類型。
我需要Expression.Convert或其他東西嗎?
注意:將多次調用該委托(篩選方法),因此需要對其進行編譯以確保性能。
編輯:解決方案(由馬克·格雷韋爾提供)
變量“ body”應更改為以下內容:
var body = Expression.Convert(
Expression.Property(
Expression.Convert(arg, type),
name),
typeof(object));
內部Convert
將輸入參數Convert
為對象,外部Convert
將返回值Convert
。
是:
var arg = Expression.Parameter(typeof(object));
var expr = Expression.Property(Expression.Convert(arg, type), propertyName);
注意: 返回類型 ( object
)意味着許多類型需要裝箱。 既然您提到過,您這樣做是為了進行過濾:如果可能的話,請嘗試通過創建一個Func<object,bool>
來避免此框,該函數內部進行任何比較而不進行裝箱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.