2013-04-25 7 views
15

मैं गतिशील रूप से nHibernate के लिए linq प्रश्नों का निर्माण कर रहा हूं।एक LambdaExpression टाइप करने के लिए अभिव्यक्ति <Func<T, T>>

निर्भरताओं के कारण, मैं बाद में टाइप की गई अभिव्यक्ति को कास्ट/पुनर्प्राप्त करना चाहता था, लेकिन मैं अब तक असफल रहा हूं।

यह काम कर रहा है नहीं (डाली कहीं ऐसा माना जाता है):

var funcType = typeof (Func<,>).MakeGenericType(entityType, typeof (bool)); 
var typedExpression = (Func<T, bool>)Expression.Lambda(funcType, itemPredicate, parameter); //Fails 

यह काम कर रहा है:

var typedExpression = Expression.Lambda<Func<T, bool>>(itemPredicate, parameter); 

यह संभव हो 'समझाया' करने के लिए एक LambdaExpression से अभिव्यक्ति टाइप किया है ?

+0

हो सकता है आप typedExpression.Compile() – jure

+1

मैं अपने ORM नक्शाकार के साथ एक IQueryable के रूप में अभिव्यक्ति का उपयोग करने के लिए तो यह संकलित नहीं किया जा सकता की जरूरत के लिए देख रहे हैं। – Larantz

उत्तर

24
var typedExpression = 
    (Func<T, bool>)Expression.Lambda(funcType, itemPredicate, parameter); //Fails 

यह आश्चर्य की बात आप (जो क्या Func<T, bool> है) एक वास्तविक प्रतिनिधि है कि लागू किया जा सकता है प्राप्त करने के लिए Compile एक LambdaExpression करने के लिए है के रूप में नहीं है,।

तो यह काम करेगा, लेकिन मैं निश्चित नहीं हूँ अगर यह तुम क्या जरूरत है:

// This is no longer an expression and cannot be used with IQueryable 
var myDelegate = 
    (Func<T, bool>) 
    Expression.Lambda(funcType, itemPredicate, parameter).Compile(); 

आप अभिव्यक्ति संकलित करने के लिए एक अभिव्यक्ति पेड़ के चारों ओर ले जाने के लिए नहीं देख रहे हैं, तो लेकिन इसके बजाय, तो समाधान बजाय एक Expression<Func<T, bool>> को कास्ट करने के लिए किया जाता है:

var typedExpression = (Expression<Func<T, bool>>) 
         Expression.Lambda(funcType, itemPredicate, parameter); 
+0

उत्तर के लिए धन्यवाद। हां मैं अभिव्यक्ति के पेड़ को चारों ओर ले जाना चाहता हूं। समस्या वह है जिसे आप 'अभिव्यक्ति > टाइप किए गए एक्सप्रेशन = अभिव्यक्ति। लैम्ब्डा (funcType, itemPredicate, पैरामीटर) में संदर्भित कर रहे हैं;' परिणाम 'में परिणाम सॉस प्रकार सिस्टम को परिवर्तित नहीं कर सकते हैं। Linq.Expressions.LambdaExpression लक्ष्य प्रकार System.Linq.Expressions.Expression > ' – Larantz

+0

@Larantz: क्षमा करें, मेरी गलती; मैं भूल गया कि आपको स्पष्ट रूप से डालने की जरूरत है। अद्यतन उत्तर देखें। – Jon

+1

धन्यवाद। मैं विश्वास नहीं कर सकता कि मुझे कितना अंधा नहीं था कि मुझे अभिव्यक्ति <> कास्ट का हिस्सा नहीं था :)। – Larantz

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