2012-07-11 3 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

런타임에 '발표자'유형을 알고 있습니까? – driis

+0

예, 있습니다. 기본적으로 발표자 유형은 generic에서 사용할 수 있으므로 typeof (TPresenter)에서 유형을 쉽게 얻을 수 있습니다 – madcyree

답변

4

여기서 핵심은 다중 문 람다를 얻기 위해 Expression.Block을 사용하는 것입니다. 당신은 같은 것을 사용할 수 있습니다 등등

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

관련 문제