2011-08-31 10 views
10

संभव डुप्लिकेट:
How do I detect the "new" modifer on a field using reflection?यह निर्धारित करने के लिए कि क्या फ़ील्ड में प्रतिबिंब के माध्यम से 'नया' संशोधक है?

निम्नलिखित घोषणा

public class B : A 
{ 
    public new string Name; 
} 

मैं कैसे तय करते हैं कि क्षेत्र अपने FieldInfo उदाहरण के लिए 'नए' संशोधक है हो रही है?

+4

तुम सच में इस तरह के खेतों का खुलासा नहीं करना चाहिए ... बजाय एक संपत्ति का उपयोग करें। –

+1

भी तुम सिर्फ मान निर्धारित करना चाहिए, एक नया संदर्भ नहीं बनाया। –

+1

@Daniel: इस मामले में नया आधार वर्ग –

उत्तर

5

मुझे लगता है कि आपको एक ही नाम वाले सदस्य के लिए बेस-क्लास पदानुक्रम खोजना होगा, और यदि यह नहीं है, तो यह नया है।

मैं जानता हूँ कि यह बदसूरत है, लेकिन एक ही सवाल How do I detect the "new" modifer on a field using reflection? को यह अन्य जवाब पर टिप्पणी के अनुसार, यह कहते हैं:

मैं ILSpy के स्रोत कोड पर एक नज़र ले लिया है, वे एक ही बात कर रहे हैं - विरासत श्रृंखला चलना। वे Mono.Cecil का उपयोग कर रहे हैं, लेकिन कोई विशेष जानकारी नहीं है जो प्रतिबिंब के माध्यम से अनुपलब्ध है। अधिक जानकारी के लिए, ILSpy की AstBuilder.SetNewModifier विधि पर एक नज़र डालें।

शायद आप जो उम्मीद कर रहे हैं, उसके लिए खेद नहीं है।

+1

हां, मुझे कुछ ऐसा लगता है जैसे FieldInfo.IsNew लेकिन आपका समाधान जाने के तरीके की तरह लगता है। धन्यवाद! – UserControl

8

फ़ील्ड के लिए, ऐसा कोई अस्तित्व नहीं है; आईएल बस है:

.field public string Name 

आदि - के बाद से वहाँ आभासी क्षेत्रों की धारणा नहीं है या newslot आदि new संशोधक यहाँ विशुद्ध रूप से मौजूद संकलक के लिए, आप का दावा करने के लिए है कि आप स्वीकार करते हैं कि आप क्या कर रहे हैं थोड़ा उलझन में कुछ। new जोड़ना एक कंपाइलर चेतावनी (CS0108) दबाएगा, लेकिन आईएल नहीं बदलता है। इस प्रकार, आप औपचारिक रूप सेnew डी फ़ील्ड बनाम फ़ील्ड बनाम new के बिना छुपाए गए फ़ील्ड के बीच अंतर नहीं कर सकते हैं।

यह बेहतर है, हालांकि हो सकता है, अगर आप अपने आप को सार्वजनिक एक्सेसर गुणों के साथ निजी क्षेत्रों तक ही सीमित। और ध्यान दें कि किसी भी घटना में: बेस प्रकार में फ़ील्ड अभी भी मौजूद है।

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