我需要編寫一個泛型方法,它以字符串格式獲取泛型類型的實例和屬性名稱,並返回一個表達式樹
我需要轉換一個簡單的lambda表達式
a => a.SomePropertyName
其中a
是泛型類型, 它將具有名稱SomePropertyName
的屬性
我知道我們可以使用以下反射代碼獲取屬性信息
System.Reflection.PropertyInfo propInfo = a.GetType().GetProperty("SomePropertyName");
這可能很簡單,但我不熟悉Expression樹,如果有類似的問題,請鏈接並關閉
假設事先不知道參數類型和返回類型,您可能必須使用某個object
,但從根本上說這只是:
var p = Expression.Parameter(typeof(object));
var expr = Expression.Lambda<Func<object, object>>(
Expression.Convert(
Expression.PropertyOrField(
Expression.Convert(p, a.GetType()), propName), typeof(object)), p);
如果已知輸入和輸出類型,則可以調整Func<,>
參數,並可能刪除Expression.Convert
。在極端情況下,您可以在不知道lambda 簽名的情況下獲得lambda ,通過:
var p = Expression.Parameter(a.GetType());
var expr = Expression.Lambda(Expression.PropertyOrField(p, propName), p);
你可以用這個:
var p = Expression.Parameter(a.GetType(), "x");
var body = Expression.Property(p, "SomePropertyName");
Expression.Lambda(body, p);