हमें संपत्ति के बजाय यहां संपत्ति के तरीकों के संदर्भ में निपटना होगा, क्योंकि यह संपत्ति के प्राप्त/सेट विधियों को वास्तव में संपत्ति के बजाय ओवरराइड किया जाता है। मैं प्राप्त विधि का उपयोग करूंगा क्योंकि आपके पास कभी भी संपत्ति नहीं होनी चाहिए, हालांकि एक पूर्ण समाधान की कमी की जांच करनी चाहिए।
कई मामलों में उत्सर्जित आईएल को देखते हुए, बेस प्रॉपर्टी की 'गेट' विधि में मेटाडाटा टोकन होगा (यह सी # कंपाइलर से है; अन्य hidebysig
को उनके विधि छिपाने वाले अर्थशास्त्र के आधार पर उत्सर्जित नहीं कर सकते हैं,
non-virtual : .method public hidebysig specialname instance
virtual : .method public hidebysig specialname newslot virtual instance
व्युत्पन्न एक निम्न टोकन होगा: जो मामले में विधि छिपाने-दर-नाम) होगा
override : .method public hidebysig specialname virtual instance
new : .method public hidebysig specialname instance
new virtual : .method public hidebysig specialname newslot virtual instance
तो हम इस से देख सकते हैं कि यह संभव नहीं है विधि के मेटाडेटा टोकन से पूरी तरह से बताएं कि क्या यह है new
है क्योंकि गैर वर्चुअल बेस विधि में गैर-वर्चुअल new
विधि के समान टोकन हैं, और वर्चुअल बेस विधि में new virtual
विधि के समान टोकन हैं।
क्या हम कह सकते हैं कि यह एक आधार विधि को ओवरराइड करता है, तो विधि virtual
टोकन नहीं लेकिन newslot
टोकन है तो छाया यह है, यानी बजाय है
var prop = typeof(ChildClass).GetProperty("TempProperty");
var getMethod = prop.GetGetMethod();
if ((getMethod.Attributes & MethodAttributes.Virtual) != 0 &&
(getMethod.Attributes & MethodAttributes.NewSlot) == 0)
{
// the property's 'get' method is an override
}
मान लिया जाये, तो, हम पाते हैं कि विधि 'के लिए' एक ओवरराइड, हम जानना चाहते आधार वर्ग है कि यह पीछा कर रहा है में एक संपत्ति है या नहीं चाहते नहीं है। समस्या यह है कि क्योंकि विधि एक अलग विधि तालिका स्लॉट में है, लेकिन वास्तव में यह छायांकन के तरीके से कोई सीधा संबंध नहीं है। तो हम वास्तव में क्या कह रहे हैं "क्या बेस प्रकार में कोई तरीका है जो छायांकन के मानदंडों को पूरा करता है", जो इस बात पर निर्भर करता है कि विधि hidebysig
या छुपाएं-नाम है या नहीं।
पूर्व के लिए हमें यह जांचने की आवश्यकता है कि बेस क्लास में कोई तरीका है जो हस्ताक्षर से बिल्कुल मेल खाता है, जबकि बाद के लिए हमें यह जांचने की आवश्यकता है कि उसके पास एक ही नाम के साथ कोई विधि है, इसलिए ऊपर से कोड जारी रखें:
else
{
if (getMethod.IsHideBySig)
{
var flags = getMethod.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic;
flags |= getMethod.IsStatic ? BindingFlags.Static : BindingFlags.Instance;
var paramTypes = getMethod.GetParameters().Select(p => p.ParameterType).ToArray();
if (getMethod.DeclaringType.BaseType.GetMethod(getMethod.Name, flags, null, paramTypes, null) != null)
{
// the property's 'get' method shadows by signature
}
}
else
{
var flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;
if (getMethod.DeclaringType.BaseType.GetMethods(flags).Any(m => m.Name == getMethod.Name))
{
// the property's 'get' method shadows by name
}
}
}
मुझे लगता है कि यह सबसे अधिक तरीका है, लेकिन मुझे अभी भी नहीं लगता कि यह बिल्कुल सही है। शुरुआत के लिए मैं नाम से छिपाने से पूरी तरह से परिचित नहीं हूं क्योंकि सी # इसका समर्थन नहीं करता है और यह मेरे द्वारा उपयोग किए जाने वाले बहुत अधिक है, इसलिए मैं यहां कोड में गलत हो सकता हूं जो इंगित करता है कि एक आवृत्ति विधि स्थिर हो सकती है। मुझे केस संवेदनशीलता समस्या के बारे में भी पता नहीं है (उदाहरण के लिए वीबी में Foo
नामक एक विधि को foo
नामक एक विधि कहा जा सकता है, यदि दोनों के पास एक ही हस्ताक्षर था और hidebysig
दोनों थे - सी # में उत्तर नहीं है, लेकिन अगर उत्तर हाँ है वीबी तो इसका मतलब है कि इस सवाल का जवाब वास्तव में nondeterministic है)।
खैर, मुझे यकीन नहीं है कि यह सब कुछ कितना मददगार है, यह स्पष्ट करने के अलावा कि यह वास्तव में एक कठिन समस्या है, जैसा कि मैंने सोचा था कि यह होगा (या मैंने वास्तव में कुछ याद किया है जो मैं चाहता हूं जानना चाहता हूँ!)। लेकिन उम्मीद है कि इसमें पर्याप्त सामग्री है जो यह आपको प्राप्त करने में मदद करने में आपकी सहायता करती है।
सभी महान जानकारी के लिए धन्यवाद। मैं जल्द ही इसका प्रयोग करूँगा। –
मुझे यकीन है कि आपको बेसटाइप.GetMethod() पर अपने कॉल में 'बाइंडिंगफ्लैग.एक्सएक्ट बाइंडिंग' भी शामिल करने की आवश्यकता है। अन्यथा, यह रिपोर्ट करेगा कि 'बूल इक्वाल्स (फू अन्य)' छुपाएं 'ऑब्जेक्ट। एक्वाल्स (ऑब्जेक्ट) ' – RobSiklos
इस उत्तर में समस्या यह है कि लाइन var [prop = typeof (ChildClass) .GetProperty (" TempProperty "); ] यदि आपका प्रकार कार्यान्वयनकर्ता है तो फेंक देगा और त्रुटि होगी। आपको एक "संदिग्ध मैच मिलेगा।" और यदि आप एक .GetProperties() करते हैं तो आप देखेंगे कि छायांकित संपत्ति दो बार दिखाई देगी। इसलिए इस काम को करने का एकमात्र तरीका इंडेक्स द्वारा गुणों के माध्यम से संभव चक्र है और उन्हें परीक्षण करें और फिर डुप्लिकेट नामों का ट्रैक रखें और तय करें कि किस का उपयोग करना है। – jrandomuser