2012-07-11 47 views
2

比方說,我已經創建在運行下面的方法複雜的生成器方法與表達式樹

Type someType = ...; // assigned somewhere 

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

有誰知道我可以創建使用表達式樹運行這樣的方法?

+0

你知道運行時'presenter'的類型嗎? – driis 2012-07-11 20:53:08

+0

是的,我願意。基本上,演示者類型可以從泛型中獲得,所以我們可以很容易地從typeof(TPresenter) – madcyree 2012-07-11 21:03:08

回答

4

這裏的關鍵是使用Expression.Block來獲得多語句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;} 
} 

當然,你需要調整這個以滿足您的需求,這部分是可變的,哪些不是,等等,但它表明了總體思路。

+0

獲得類型哇,看起來很棒。非常感謝你 – madcyree 2012-07-11 21:16:17