2010-04-12 5 views
17

से एक प्रतिनिधि बनाएं एक प्रतिनिधि एक विधि से आप संकलन प्रकार सुरक्षित सिंटैक्स का उपयोग कर सकते हैं बनाने के लिए:एक संपत्ति गेटर या सेटर विधि

private int Method() { ... } 

// and create the delegate to Method... 
Func<int> d = Method; 

प्रॉपर्टी का अभिप्राय किसी गेटर और सेटर विधि के चारों ओर एक आवरण है, और मैं एक संपत्ति गेटटर विधि में एक प्रतिनिधि बनाना चाहता हूँ। कुछ

public int Prop { get; set; } 

Func<int> d = Prop; 
// or... 
Func<int> d = Prop_get; 

दुर्भाग्य से काम नहीं करता है। मैं जब गेटर विधि वैसे भी प्रतिनिधि हस्ताक्षर से मेल खाता है एक अलग लैम्ब्डा विधि है, जो अनावश्यक लगता है बनाने के लिए:

Func<int> d =() => Prop; 

आदेश सीधे प्रतिनिधि विधि का उपयोग करने, मैं बुरा प्रतिबिंब है, जो संकलन नहीं है का उपयोग करने के है में टाइप-सुरक्षित:

// something like this, not tested... 
MethodInfo m = GetType().GetProperty("Prop").GetGetMethod(); 
Func<int> d = (Func<int>)Delegate.CreateDelegate(typeof(Func<int>), m); 

वहाँ एक संकलन सुरक्षित रास्ते में सीधे एक संपत्ति हो रही विधि पर एक प्रतिनिधि बनाने, शीर्ष पर एक सामान्य पद्धति पर एक प्रतिनिधि बनाने के लिए इसी तरह की कोई तरीका है, एक का उपयोग करने के जरूरत के बिना मध्यवर्ती लैम्ब्डा विधि?

+0

लैम्ब्डा के साथ बात क्या है? –

+0

यह एक अतिरिक्त अनावश्यक विधि है, और चीजों को आवश्यकतानुसार अधिक जटिल बनाता है, क्योंकि संपत्ति गेटर पहले से ही प्रतिनिधि हस्ताक्षर से मेल खाता है – thecoop

+0

मैं यहां अपना बिंदु देखने में असफल रहा हूं: एक लैम्ब्डा क्लास विधि नहीं है, लेकिन एक प्रतिनिधि को तुरंत चालू करने का एक तरीका है । Func d =() => प्रस्ताव का अर्थ है कि मैं अपने प्रतिनिधि डी को एक्सेसर –

उत्तर

6

जहाँ तक मैं कह सकता हूं, आप पहले से ही सभी "वैध" रूपों को लिख चुके हैं। चूंकि सामान्य कोड में गेटटर या सेटर को स्पष्ट रूप से संबोधित करना संभव नहीं है (प्रतिबिंब के बिना, यह है), मुझे नहीं लगता कि आप जो चाहते हैं उसे करने का एक तरीका है।

+1

कोड में प्रत्यक्ष संदर्भ का उपयोग कर संपत्ति गेटटर विधि के लिए MethodInfo प्राप्त करने के लिए कंपाइलर प्राप्त करने का कोई तरीका नहीं है? :( – thecoop

+1

ठीक है, केवल मैं सोच सकता हूं कि किस काम को काम करना चाहिए लैम्ब्डा और अभिव्यक्ति वृक्ष के माध्यम से है। लेकिन अभिव्यक्ति के पेड़ का विश्लेषण करने के लिए कुछ सहायक कोड भी आवश्यक है। Http://msdn.microsoft.com/en-us/library देखें /bb397951.aspx और http://msdn.microsoft.com/en-us/library/system.linq.expressions.memberexpression.aspx – Lucero

0

एक अन्य विकल्प (.NET 3.0 और नए में) एक पारंपरिक संपत्ति के बजाय DependencyProperty का उपयोग करना होगा। फिर आप DependencyProperty ऑब्जेक्ट (एक प्रतिनिधि के चारों ओर जाने के बजाए) पास कर सकते हैं, और आवश्यकता होने पर GetValue() या SetValue() पर कॉल कर सकते हैं।

(हाँ, मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन यह शीर्ष पदों जब मैं बहुत समान कुछ करने के लिए कोशिश कर रहा था से एक था।)