【问题标题】:How to use Expression to get Func<ProductModel, int> by a specific string?如何使用 Expression 通过特定字符串获取 Func<ProductModel, int>?
【发布时间】:2017-05-21 16:08:40
【问题描述】:

我有 SumGetters 的 ProductModel 和字典

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},
};

我尝试从字符串中获取特定列。

例如。如果字符串是Column1,则得到model=&gt;model.Column1

如何使用表达式树来实现这个功能?

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

【问题讨论】:

  • 那么,给定一个"Column1" 字符串和一个ProductModel 类型,你想要一个model =&gt; model.Column1 表达式吗?
  • @xanatos 是的,你明白了。

标签: c# lambda expression func


【解决方案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;
}

请注意,创建和编译表达式树是“慢”的,所以我正在缓存创建的表达式。如果你只想要表达式树before编译,那么你可以在exp找到它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2014-07-08
    • 1970-01-01
    相关资源
    最近更新 更多