2015-11-17 6 views
6

मैं वर्तमान में एकएक अनावश्यक मुक्केबाजी निकाला जा रहा है एसी # अभिव्यक्ति से परिवर्तित

Expression<Func<T,bool>> 

के लिए एक

Expression<Func<T,object>> 

कन्वर्ट करने के लिए कोशिश कर रहा हूँ वर्तमान में घड़ी मुझे पता चलता है कि मेरी अभिव्यक्ति रखती

Expression<Func<T,object>> myExpression = model=>Convert(model.IsAnAirplane) 

मैं इसे

पर सरल बनाना चाहता हूं
Expression<Func<T,bool>> myExpression = model=>model.IsAnAirplane 

वर्तमान में मैं केवल एक परिवर्तित जोड़ने में सफल, जिसका परिणाम:

Expression<Func<T,bool>> myExpression = model=>Convert(Convert(model.IsAnAirplane)) 

लेकिन चूंकि अंतर्निहित प्रकार एक bool है, मैं सही है, पूरी तरह धर्मान्तरित खरोंच करने में सक्षम होना चाहिए? मैं अभिव्यक्ति आगंतुकों से परिचित हूं, लेकिन फिर भी यह पता नहीं लगा सकता कि कन्वर्ट को कैसे हटाया जाए।

संपादित करें: इस सवाल का Generic unboxing of Expression<Func<T, object>> to Expression<Func<T, TResult>> को यह स्वीकार कर लिया जवाब (कि हो सकता है एक संभावित डुप्लिकेट) मेरे लिए काम नहीं करता है ... के रूप में अभिव्यक्ति एफई द्वारा अनुवादित हो जाता है, आप देख सकते हैं यह (कन्वर्ट()) में कनवर्ट करता है बजाय केवल पहले कनवर्ट को हटाने के लिए ..., इसका परिणाम "System.Object 'टाइप करने के लिए" System.Boolean' टाइप करने में असमर्थ है। LINQ से इकाइयां केवल ईडीएम आदिम या गणना प्रकारों कास्टिंग करने का समर्थन करती हैं। "

उत्तर

4

आप कुछ इस तरह का उपयोग कर किसी भी Convert रैपर को निकाल देते में सक्षम होना चाहिए:

Expression<Func<YourModel, object>> boxed = m => m.IsAnAirplane; 

var unboxed = (Expression<Func<YourModel, bool>>)StripConvert(boxed); 

// ... 

public static LambdaExpression StripConvert<T>(Expression<Func<T, object>> source) 
{ 
    Expression result = source.Body; 
    // use a loop in case there are nested Convert expressions for some crazy reason 
    while (((result.NodeType == ExpressionType.Convert) 
       || (result.NodeType == ExpressionType.ConvertChecked)) 
      && (result.Type == typeof(object))) 
    { 
     result = ((UnaryExpression)result).Operand; 
    } 
    return Expression.Lambda(result, source.Parameters); 
} 

आप चाहें, तो आप StripConvert बदल सकता है एक सादे LambdaExpression के बजाय Expression<Func<T,U>> लौट सकते हैं और विधि के अंदर ही डाली प्रदर्शन करने के लिए , लेकिन उस स्थिति में आप विधि कॉल के लिए टाइप-इनफ्रेंसिंग का लाभ नहीं ले पाएंगे।

+0

यह वही करता है जो मैं चाहता था, और एक आकर्षण की तरह काम करता है, धन्यवाद! –

+0

धन्यवाद, यह वास्तव में मेरे बट को बचाया –

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