में मैं Getter
और Setter
तरीकों के लिए प्रतिनिधि बनाकर मेरा प्रतिबिंब कोड बेहतर बनाने की कोशिश कर रहा हूँ।एक कार्रवाई <T> या समारोह <T> में एक प्रतिनिधि कास्टिंग क्रम
मेरे कोड इस तरह दिखता है:
MyObject obj = new MyObject();
var prop = obj.GetType().GetProperty("Prop");
var getType = typeof(Func<>).MakeGenericType(prop.PropertyType);
var setType = typeof(Action<>).MakeGenericType(prop.PropertyType);
var getMethod = prop.GetGetMethod().CreateDelegate(getType, obj);
var setMethod = prop.GetSetMethod().CreateDelegate(setType, obj);
// I'd like to change this section and not to use a dynamic!!
dynamic castedGet = Convert.ChangeType(getMethod, getType);
dynamic castedSet = Convert.ChangeType(setMethod, setType);
CreateDelegate
रिटर्न एक Delegate
और DynamicInvoke
का उपयोग कर प्रदर्शन समझदारी नहीं है।
मैंने Delegate
को Action<T> \ Func<T>
में डाला (हार्डकोड किया) और मेरे प्रदर्शन में भारी वृद्धि देखी।
मैं तो (Convert.ChangeType
और dynamic
का प्रयोग करके) क्रम में Action<T> \ Func<T>
में Delegate
कास्ट करने के लिए कोशिश की और मेरे प्रदर्शन चोट लगी - शायद इस तथ्य है कि मैं एक dynamic
प्रकार उपयोग कर रहा हूँ की वजह से।
मुझे पूरा यकीन है कि मैं dynamic
के बिना ऐसा कर सकता हूं।
मुझे लगता है कि समाधान expression trees
के साथ कुछ है, लेकिन मैं वास्तव में कुछ इस तरह कोड करने के लिए कैसे यकीन नहीं है। अगर किसी के पास कोई अच्छा समाधान है जो expression trees
का उपयोग नहीं करता है, तो इसके बारे में भी सुनना दिलचस्प होगा।
क्या आप इस कोड * हर * समय को निष्पादित कर रहे हैं, या प्रतिनिधियों को कहीं और कैश कर रहे हैं और फिर उन्हें बुला रहे हैं? – Dai
@ दाई - यह मेरे कोड का एक छोटा सा हिस्सा है और एक नमूना है। मैं एक आलसी तरीके से - प्रत्येक संपत्ति के लिए propertyinfo, गेटर, सेटर कैश करने के लिए देख रहा हूँ। –
फिर भी आप 'गतिशील' का उपयोग क्यों कर रहे हैं? 'कनवर्ट करें। चेंज टाइप' देर से बाध्य वस्तु वापस नहीं करता है। – Dai