2011-06-27 11 views
11

मैं गतिशील रूप से जेनरेट किए गए कोड का थोड़ा सा निर्माण करने के लिए अभिव्यक्ति का उपयोग कर रहा हूं। मेरा समाधान काम करता है, एक सुविधा को छोड़कर: मैं एक चेक प्रकार-कास्ट करना चाहता हूं, जहां कास्ट विफल होने पर TypeCastException फेंक दिया जाता है।अभिव्यक्ति वृक्ष में चेक-कास्ट चेक किया गया?

मुझे अभिव्यक्ति मिली है। टाइप(), जो टाइप रूपांतरण करता है, लेकिन जब फेंकने में विफल रहता है, तो यह फेंकने की बजाए शून्य हो जाता है।

क्या अभिव्यक्ति में चेक-प्रकार कास्ट करने का कोई आसान तरीका है? या क्या मुझे नल की जांच करनी है और खुद को अपवाद फेंकना है?

यहाँ मैं क्या है: -

ParameterExpression typedAttribute = Expression.Variable(attributeType, "typedAttribute"); 
ParameterExpression typedValue = Expression.Variable(valueType, "typedValue"); 

BlockExpression methodBlock = Expression.Block(new[] { typedAttribute, typedValue }, new Expression[] 
    { 
     Expression.Assign(typedAttribute, Expression.TypeAs(attribute, attributeType)), 
     Expression.Assign(typedValue, Expression.TypeAs(value, valueType)), 
     Expression.Call(visitor, methodInfo, typedAttribute, typedValue), 
     Expression.Assign(visited, Expression.Constant(true)), 
    }); 

उत्तर

12

Expression.Convert यहाँ एक कलाकारों के रूप में कार्य करना चाहिए।

+1

धन्यवाद, यह काम करता है। मुझे वास्तव में अभिव्यक्ति की कोशिश करना याद है। पहले() पहले, लेकिन मुझे लगता है कि उस समय मेरे कोड में एक और त्रुटि थी, जिसने मुझे यह देखने से रोका कि यह सही समाधान था। वैसे भी, एक निश्चित उत्तर बहुत जल्दी है! – PeteAC

+0

वहाँ एक तेज कास्ट है? मैं संकलित सेटर्स/गेटर्स बना रहा हूं लेकिन ऑब्जेक्ट करने के लिए बॉक्सिंग अनबॉक्सिंग सब कुछ धीमा कर देता है .. –

+1

@ डेमेट्रिस तब: बॉक्स किए गए डेटा का उपयोग न करें ... संदर्भ के बिना उससे अधिक कहना मुश्किल है –

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