2017-05-21 37 views
0

我有以下產品型號和字典SumGetters如何使用Expression通過特定字符串獲取Func <ProductModel,int>?

public class ProductModel 
{ 
    public int Id { get; internal set; } 
    public int Column1 { get; internal set; } 
    public int Column2 { get; internal set; } 
    public int Column3 { get; internal set; } 
} 

private static readonly Dictionary<string, Func<ProductModel, int>> SumGetters = new Dictionary<string, Func<ProductModel, int>> 
{ 
    { "Column1", model => model.Column1}, 
    { "Column2", model => model.Column2}, 
    { "Column3", model => model.Column3}, 
}; 

我嘗試從字符串獲得特定的列。

Ex。如果字符串是Column1,那麼得到model=>model.Column1

如何使用表達式樹來實現這個功能?

Func<ProductModel, int> sumGetter; 
var isGettingSumGetter = SumGetters.TryGetValue(request.Column, out sumGetter); 
+0

因此,給定一個「Column1」字符串和一個「ProductModel」類型,你需要一個'model => model.Column1'表達式? – xanatos

+0

@xanatos是的,你知道了。 – letitbe

回答

1

不清楚你問什麼,但也許這就是你想要的東西:

private static readonly Dictionary<string, Func<ProductModel, int>> productModelGettersCache = new Dictionary<string, Func<ProductModel, int>>(); 

public static Func<ProductModel, int> GetGetter(string column) 
{ 
    Func<ProductModel, int> getter; 

    if (!productModelGettersCache.TryGetValue(column, out getter)) 
    { 
     var par = Expression.Parameter(typeof(ProductModel)); 
     var exp = Expression.Lambda<Func<ProductModel, int>>(Expression.Property(par, column), par); 
     getter = exp.Compile(); 
    } 

    return getter; 
} 

注意,創建和編譯一個表達式樹是「慢」,所以我緩存創建的表達式。如果您只想在編譯之前的表達式樹,那麼您可以在exp中找到它。

相關問題