2015-01-13 4 views
2

Expression<Func<T, string>> 유형의 매개 변수를 사용하여 메소드를 호출하려고하는데 빌드 한 표현식 트리에서 메소드 호출을 허용하지 않습니다. 다음은 짧지 만 완전한 프로그램이 문제를 보여주는 것 :특정 서명으로 표현식을 작성하려면 어떻게해야합니까?

using System; 
using System.Linq.Expressions; 

public class Test 
{ 
    public string Name { get { return ""; } } 

    public static void Main() 
    { 
     Foo<Test>(); 
    } 

    static void Foo<T>() 
    { 
     var parameter = Expression.Parameter(typeof(T), "t"); 
     var property = Expression.Property(parameter, "Name"); 
     var lambda = Expression.Lambda(property, parameter); 
     Bar<T>(lambda); 
    } 

    static void Bar<T>(Expression<Func<T, string>> expression) {} 
} 

오류 :

error CS1503: Argument 1: cannot convert from 
'System.Linq.Expressions.LambdaExpression' to 
'System.Linq.Expressions.Expression<System.Func<T, string>>' 

가 어떻게 방법에 내 식 트리를 통과 할 수 있습니까?

답변

2

당신은 실제로 이미 (실행시기에 적절한 형식이있는 식 트리를 구축하고 당신은 단지 메소드를 호출하려고하고 값이 그 개체의 유형을 인쇄하지 않는 경우 lambda의 의미). 그러나 lambda의 컴파일 시간 유형은 Expression<Func<T, string>>이 아니라 LambdaExpression입니다. Expression.Lambda의 비 일반 오버로드를 사용하고 있기 때문에 이 컴파일 타임에 원하는 표현식 트리 유형을 알지 못하는 경우에 사용하도록 설계 되었기 때문입니다. 그것은 실행 시간에 올바른 일을하지만 강력하게 형식화 된 방식으로 사용할 수는 없습니다.

다행히 당신이 생산하고자하는 식 트리의 유형을 알고 , 그래서 당신은 단지 Expression.Lambda의 일반적인 과부하에 대한 호출에 지정해야합니다

var lambda = Expression.Lambda<Func<T, string>>(property, parameter); 

을 던질 것이다 구현 된 표현식 트리에 올바른 유형이없는 경우 실행시 예외가 발생합니다 (예 : Value1 속성의 유형이 잘못된 경우

1

람다가 잘못 제작되었습니다.

var parameter = Expression.Parameter(typeof(T), "t"); 
var property = Expression.Property(parameter, "Value1"); 
var lambda = Expression.Lambda<Func<T, string>>(property, new[] { parameter }); 
관련 문제