2009-05-13 7 views
7

오류 메시지는 "형식 또는 네임 스페이스 이름 'T'을 (를) 찾을 수 없습니다."입니다.중첩 된 일반 식 반환 <Func <T, bool>>

???

public static Expression<Func<T, bool>> MakeFilter(string prop, object val) 
{ 
    ParameterExpression pe = Expression.Parameter(typeof(T), "p"); 
    PropertyInfo pi = typeof(T).GetProperty(prop); 
    MemberExpression me = Expression.MakeMemberAccess(pe, pi); 
    ConstantExpression ce = Expression.Constant(val); 
    BinaryExpression be = Expression.Equal(me, ce); 
    return Expression.Lambda<Func<T, bool>>(be, pe); 
} 

관련 링크 :

당신의 방법에 대해 정의 된 일반적인 인수가 없습니다

Using reflection to address a Linqed property

http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/df9dba6e-4615-478d-9d8a-9fd80c941ea2/

Runtime creation of generic Func<T>

답변

10

당신은 방법 자체가 일반해야 :

public static Expression<Func<T, bool>> MakeFilter<T>(string prop, object val) 
                -+- 
               ^
                +- this 
3

. 방법은 필요

public static Expression<Func<T, bool>> MakeFilter<T>(string prop, object val) 
{ 
    ParameterExpression pe = Expression.Parameter(typeof(T), "p"); 
    PropertyInfo pi = typeof(T).GetProperty(prop); 
    MemberExpression me = Expression.MakeMemberAccess(pe, pi); 
    ConstantExpression ce = Expression.Constant(val); 
    BinaryExpression be = Expression.Equal(me, ce); 
    return Expression.Lambda<Func<T, bool>>(be, pe); 
} 
2

은 일반 (MakeFilter<T>)로 선언 할 :

public static Expression<Func<T, bool>> MakeFilter<T>(string prop, object val) 

그렇지 않으면, 어떻게 다른 호출자가 T은 무엇 지정 할 수있을 것입니다 당신은 하나 (MakeFilter<T>)를 정의해야합니까?