2012-01-23 14 views
14

के लिए उपयोग नहीं किया जा सकता है। मैंने एक अभिव्यक्ति बनाई है जो मैं सॉर्टिंग के लिए उपयोग कर रहा हूं जो ठीक काम करता है, जब तक कि मैं DateTime फ़ील्ड हिट नहीं करता, जहां मुझे मिलता है निम्नलिखित (दूसरी पंक्ति पर) त्रुटि:प्रकार 'सिस्टम.डेटाइम' प्रकार का अभिव्यक्ति रिटर्न प्रकार 'सिस्टम.ऑब्जेक्ट'

प्रकार 'System.DateTime' की अभिव्यक्ति वापसी प्रकार के लिए इस्तेमाल नहीं किया जा सकता है 'System.Object'

यहाँ मेरी कोड है:

ParameterExpression param = Expression.Parameter(typeof(MyEntity), "x"); 

Expression<Func<MyEntity, object>> sortExpression = 
    Expression.Lambda<Func<AMyEntity, object>>(
     Expression.Property(param, sortKey), param); 

क्या कोई भी मदद कर सकता है?

+2

के संभावित डुप्लिकेट [प्रकार 'System.Int32' का अभिव्यक्ति रिटर्न प्रकार 'System.Object'] के लिए उपयोग नहीं किया जा सकता है (http://stackoverflow.com/questions/2200209/expression-of-type-system-int32-cannot-be-used- फॉर-रिटर्न-टाइप-सिस्टम-ऑब्जेक्ट) – nawfal

उत्तर

30

बस वहाँ में एक रूपांतरण जोड़ें:

Expression<Func<MyEntity, object>> sortExpression = 
    Expression.Lambda<Func<AMyEntity, object>>(
     Expression.Convert(
      Expression.Property(param, sortKey), 
      typeof(object)), 
     param); 
10

आप अभिव्यक्ति की वापसी प्रकार मैच के लिए मूल्य-प्रकार के ऑटो मुक्केबाजी की उम्मीद दिखाई देते हैं। दुर्भाग्य से, Expression.Lambda ऐसा नहीं करता है।

आप मुक्केबाजी करने के लिए Expression.Convert का उपयोग कर सकते हैं।

var body = Expression.Convert(Expression.Property(param, sortKey), typeof(object)); 
var sortExpression = Expression.Lambda<Func<AMyEntity, object>>(body, param); 

किसी कारण से आप रूपांतरण आपरेशन अभिव्यक्ति में उपस्थित होने के लिए अगर संपत्ति पहले से ही एक संदर्भ प्रकार है नहीं करना चाहती हैं, तो आप के रूप में आवश्यक शाखा कर सकते हैं:

Expression body = Expression.Property(param, sortKey); 

if(body.Type.IsValueType) 
    body = Expression.Convert(body, typeof(object)); 
+0

पूरी तरह से काम करता है - बहुत धन्यवाद! – Wildcat

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