2

假设我必须在运行时创建以下方法

Type someType = ...; // assigned somewhere

var method = (presenter) => 
{
    var instance = new SomeType(); // I've only default constructor here
    instance.SomeProperty = presenter;
    return instance;
}

有人知道如何在运行时使用表达式树创建这样的方法吗?

4

1 回答 1

4

这里的关键是用来Expression.Block获取multi statement lambda。你可以使用类似的东西:

void Main()
{
    var p = Expression.Parameter(typeof(int), "presenter");
    var instance = Expression.Variable(typeof(Foo), "instance");
    var ctor = typeof(Foo).GetConstructor(new Type[0]);
    var block = Expression.Block(new [] { instance },
        Expression.Assign(instance, Expression.New(ctor)),
        Expression.Assign(Expression.Property(instance, "SomeProperty"), p),
        instance
    );

    var lambda = Expression.Lambda<Func<int,Foo>>(block, p);
    Foo f = lambda.Compile()(5);
    Console.WriteLine(f.SomeProperty);
}

class Foo 
{
    public int SomeProperty {get;set;}
}

当然,您需要调整它以适应您的需求,哪些部分是可变的,哪些不是,等等,但它展示了总体思路。

于 2012-07-11T21:12:16.253 回答