2013-04-23 5 views
0

입니다 Func을 에 Func을 <유형, 객체> 표현을 변환, 그래서 그것을 변경하지 못할. 문제는 일반적인 것이 아니므로 반환 된 객체를 어떤 유형으로 형 변환해야합니다. 이 유형은 Create 메소드를 호출하는 다른 일반 클래스의 제한 조건에 의해 제공됩니다. 는 T가 나는 위의 위의 기능에 대한 제어가없는이 정적 기능</p> <pre><code>public static object Create(Type t) { //unimportant } </code></pre> <p>이 제네릭 제약

이 내가 도달 한 곳이다 : 이전에 내가 최종 대리자를 컴파일 아니에요 내 위의 접근 방식에서

public static class Creator<T> 
{ 
    public static void Create() 
    { 
     var m = typeof(SomeClass).GetMethod("Create"); 
     var p = Expression.Parameter(typeof(Type)); 
     var e = Expression.Call(m, p); 

     //at this stage I want to create delegate for calling the 'Create' method, 
     //then pass typeof(T) as parameter, get returned object, 
     //and finally cast it to 'T'. 

     //for eg, I can do it like this: 
     var f = Expression.Lambda<Func<Type, object>>(e, p).Compile(); 
     Func<T> mainThing =() => (T)f(typeof(T)); 

     //is there a way I can achieve in one step? 
    } 
} 

하지만 한 단계. 컴파일하기 전에 캐스팅을 통합하고 Func<T>을 다시 얻으려면 어떻게해야합니까?

답변

2

내가 방금 Expression.Convert에 대한 호출을 필요가 있다고 생각하고, ConstantExpression 대신 ParameterExpression (A)의 사용

var method = typeof(SomeClass).GetMethod("Create"); 
var call = Expression.Call(method, Expression.Constant(typeof(T), typeof(Type))); 
var conversion = Expression.Convert(call, typeof(T)); 
var function = Expression.Lambda<Func<T>>(conversion).Compile(); 

(내가 그것을 테스트하지 않은,하지만 괜찮아 보이는 ...)

+0

실제 질문에 답변 해 드리겠습니다. – nawfal

6

을 당신은 많은 불필요한 농구를 뛰어 다니고있는 것 같습니다. 나는 당신이 표현 트리를 통해 이것을하고있는 이유를 이해하지 못합니다. 왜 아닙니다 :

public static class Creator<T> 
{ 
    public static void Create() 
    { 
     Func<T> mainThing =() => (T)SomeClass.Create(typeof(T)); 
    } 
} 

???

메소드 호출의 표현 트리를 작성하여 호출 한 메소드 호출을 작성하는 위임자로 다시 설정하는 목적은 무엇입니까? 왜 SomeClass.Create에 직접 전화하지 않으시겠습니까?

여기에 누락 된 것이 있습니까?

가 어떻게 컴파일하기 전에 캐스트도 포함 않습니다

는 실제 질문에 대답하려면?

Expression.Convert()을 사용하면 변환을 나타내는 표현식 트리 노드를 만들 수 있습니다.

+0

에릭, 내가 도움이되지 않는다는 귀하의 답변에 감사드립니다. 방금 Expression을 탐험하기 시작했습니다. 여기서, 많은 오래된 코드 (production stuff가 아닌)를 * 표현 방식 *으로 구현하기 시작했습니다. 이것은 무엇보다 운동이었습니다. – nawfal