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

完全を期すために、ラムダを呼び出す部分には興味がありません。表情の木をナビゲートしようとすると完全に迷子になり、釣り方を教えてくれるかもしれません。

4

2 に答える 2

1

現在、ツリー全体を翻訳する時間はありませんが、コードをコンパイルしてから、ildasm(またはリフレクターなど)を使用してコンパイラーの動作を確認することができます。自分のコードで常に同じことを行うことはできませんが、必要な式の種類がわかります。特に、この場合は次のようにします。

後で時間があれば、完全に機能する例を作成してみます。

于 2012-11-09T15:25:15.407 に答える
1
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);
}
于 2012-11-09T15:29:19.223 に答える