2015-01-16 48 views
0

如何構建表達式樹在C#中返回基於屬性的名稱的屬性的值返回值

Func<Foo, long> getValue(string propertyName) 
{ 
    // i think that the beginning of the expression tree would look like this 
    // but i'm not sure this is correct 
    var inputParameter = Expression.Parameter(typeof(Foo)); 
    var desiredProperty = typeof(Foo).GetProperty(propertyName); 
    var valueOfProperty = Expression.Property(inputParameter, desiredProperty); 
    // ... ??? todo: expression that returns value 
} 

調用該函數看起來像這樣這部分傳遞到LINQ的選擇方法的另一種表達:

value = getValue("Bar").Invoke(FooInstance) 

回答

1

應該是足夠了:

var lambda = Expression.Lambda<Func<Foo, long>>(valueOfProperty, inputParameter); 
return lambda.Compile(); 

無論如何 - 當你可以通過反射直接獲得價值時,構建Expression的目的是什麼?

return someFoo => (long)desiredProperty.GetValue(someFoo); 
+0

反射也可以,謝謝!我不確定反射會與SQL Server Linq IQueryable提供程序一起使用。 – zigzag

+0

這是偉大的,用反射我可以完全省略getValue函數,並寫入 'value =(long)typeof(Foo).GetProperty(「Bar」)。GetValue(FooInstance)'' – zigzag