簡體   English   中英

在不知道目標類型的情況下使用Expression獲取屬性值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM