2010-02-05 12 views
18

तो मेरे मामले में मैं प्रतिबिंब का उपयोग कर कक्षा की संरचना की खोज कर रहा हूं। मुझे यह पता लगाने में सक्षम होना चाहिए कि क्या संपत्ति PropertyInfo ऑब्जेक्ट द्वारा स्वत: कार्यान्वित संपत्ति है। मुझे लगता है कि प्रतिबिंब एपीआई ऐसी कार्यक्षमता का पर्दाफाश नहीं करता है क्योंकि ऑटो-गुण सी # आश्रित हैं, लेकिन क्या यह जानकारी प्राप्त करने के लिए कोई कामकाज है?यह पता लगाने के लिए कि कोई संपत्ति प्रतिबिंब के साथ एक स्वतः-लागू संपत्ति है या नहीं?

उत्तर

16

आप देखने के लिए अगर get या set विधि CompilerGenerated विशेषता के साथ चिह्नित है जांच कर सकता है। इसके बाद आप CompilerGenerated विशेषता के साथ चिह्नित एक निजी क्षेत्र की तलाश कर सकते हैं जिसमें संपत्ति का नाम और स्ट्रिंग "BackingField" है।

शायद

:

public static bool MightBeCouldBeMaybeAutoGeneratedInstanceProperty(
    this PropertyInfo info 
) { 
    bool mightBe = info.GetGetMethod() 
         .GetCustomAttributes(
          typeof(CompilerGeneratedAttribute), 
          true 
         ) 
         .Any(); 
    if (!mightBe) { 
     return false; 
    } 


    bool maybe = info.DeclaringType 
        .GetFields(BindingFlags.NonPublic | BindingFlags.Instance) 
        .Where(f => f.Name.Contains(info.Name)) 
        .Where(f => f.Name.Contains("BackingField")) 
        .Where(
         f => f.GetCustomAttributes(
          typeof(CompilerGeneratedAttribute), 
          true 
         ).Any() 
        ) 
        .Any(); 

     return maybe; 
    } 

यह सबूत, काफी भंगुर और शायद पोर्टेबल नहीं मूर्ख नहीं है करने के लिए, कहते हैं, मोनो।

+0

धन्यवाद एक बहुत जेसन, परावर्तक मुझे बीच में ही कहा था :) पहले इसके बारे में सोचा जाना चाहिए। – Zoki

+1

@ 3o4eTo: बस आगाह किया जाए कि यह मूर्ख प्रमाण, भंगुर और संभवतः मोनो को पोर्टेबल नहीं है। – jason

+0

संपत्ति पर कोई गेटटर नहीं होने पर भी अपवाद का ख्याल रखना। – nawfal

7

यह करना चाहिए:

public static bool IsAutoProperty(this PropertyInfo prop) 
{ 
    return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance) 
          .Any(f => f.Name.Contains("<" + prop.Name + ">")); 
} 

कारण है कि ऑटो-संपत्तियों के लिए समर्थन FieldInfo की Name संपत्ति दिखाई देगा:

<PropertName>k__BackingField 

पात्रों < और > के बाद से प्रदर्शित नहीं होगा सामान्य क्षेत्रों के लिए, उस तरह के नामकरण वाले क्षेत्र को ऑटो-प्रॉपर्टी के बैकिंग फ़ील्ड में इंगित किया जाता है। जैसा कि जेसन कहते हैं, अभी भी इसका भंगुर है।

या यह एक बालक तेजी से बनाने के लिए,

public static bool IsAutoProperty(this PropertyInfo prop) 
{ 
    if (!prop.CanWrite || !prop.CanRead) 
     return false; 

    return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance) 
          .Any(f => f.Name.Contains("<" + prop.Name + ">")); 
} 
संबंधित मुद्दे

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