2009-05-13 10 views
7

त्रुटि संदेश "प्रकार या नामस्थान नाम 'टी' नहीं मिला।"एक नेस्टेड जेनेरिक अभिव्यक्ति लौटना <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>) को परिभाषित करना चाहिए?

संबंधित मुद्दे