c# - 给定这个 lambda,我如何使用表达式树手动编写它?

标签 c# lambda expression

class Program
{
    static void Main(string[] args)
    {
        Expression<Func<string[], Poco>> exp = a => new Poco { MyProperty1 = a[0], MyProperty2 = a[1], MyProperty3 = a[2] };
        var lambda = exp.Compile();

        var output = lambda(new[] {"one", "two", "three"});

        Console.WriteLine(output.MyProperty1);
    }
}

class Poco
{
    public string MyProperty1 { get; set; }
    public string MyProperty2 { get; set; }
    public string MyProperty3 { get; set; }
}

我对调用 lambda 的部分不感兴趣,这只是为了完整性。我在尝试浏览表达式树时完全迷失了方向,这可能会教我如何钓鱼。

最佳答案

private static Expression<Func<string[], Poco>> CreateExpr()
{
    ParameterExpression paramExpr = Expression.Parameter(typeof(string[]), "a");
    var newExpr = Expression.New(typeof(Poco));

    var memberExprs = Enumerable.Range(0, 3)
        .Select(i =>
        {
            string propertyName = "MyProperty" + (i + 1);
            var property = typeof(Poco).GetProperty(propertyName);
            Expression.Bind(property, Expression.ArrayIndex(paramExpr, Expression.Constant(i)));
        });

    var expr = Expression.MemberInit(newExpr, memberExprs);
    return Expression.Lambda<Func<string[], Poco>>(expr, paramExpr);
}

关于c# - 给定这个 lambda,我如何使用表达式树手动编写它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13310674/

相关文章:

c# - 使用 Background Worker 时丢失 UI 功能

c# - 如何从 IEnumerable 获取模型元数据?

c# - .NET 4 和 .NET 4.6.2 之间的表达式主体差异

c# circular flatten arrays 收藏

c# - 是 Linq 还是 Lambda?

C#-根据与另一个列表的部分交集从列表中选择特定项目 (Linq + Lambda)

java - 为什么p1的默认值设置为0并且每次加1

expression - 使用 pyparsing 解析表达式列表

replace - 替换序言列表中的多个术语

c# - 通过 View 模型构造函数传递的对象实例的理想数量(依赖注入(inject))