2010-03-11 17 views
15

मैंने प्रतिबिंब का उपयोग करके गुणों को देखने के लिए कुछ कोड लिखा है। मैंने प्रतिबिंब का उपयोग कर वर्ग से गुणों की एक सूची पुनर्प्राप्त की है।एक संपत्ति पर प्रतिबिंब और पहुंच संशोधक

हालांकि मुझे यह पता लगाना होगा कि संपत्ति सार्वजनिक है या संरक्षित है या नहीं। उदाहरण:

public string Name{get;set;} 
protected int Age{get;set;} 

संपत्तिइन्फो वर्ग संपत्ति के बारे में इस जानकारी का खुलासा नहीं कर रहा है। क्या इसे करने का और कोई तरीका है?

उत्तर

22

चूंकि गुण get/set विधियों की एक जोड़ी पर सिंटैक्टिक चीनी हैं, इसलिए संपत्ति प्रतिबिंब के अनुसार "पहुंच" जैसी कोई चीज़ नहीं है। इसके बजाय, आपको get और set विधियों के पहुंच के स्तर को अलग-अलग पता लगाना होगा। इसके लिए, उचित MethodInfo ऑब्जेक्ट्स GetGetMethod और GetSetMethod विधियों के साथ पुनर्प्राप्त करें, और वहां से IsPrivate, IsPublic और अन्य विधियां और गुण हैं।

+0

आपने मुझे इसे हराया ... –

9

आप प्राप्त प्रत्येक के MethodInfo में देखने की जरूरत है & सेट विधि जैसे:

PropertyInfo pi = ...; 
bool isPublic = pi.GetGetMethod(true).IsPublic; 
bool isProtected= pi.GetGetMethod(true).IsFamily; 

यह IsFamily संपत्ति यदि एक विधि सुरक्षित है इंगित करता है कि हो रहा है ..

0
static void Main() 
    { 
     sample obj = new sample(); 
     Type t = obj.GetType(); 
     MethodInfo[] m = t.GetMethods(); 
     Console.WriteLine("Method Information:-\n\n"); 
     foreach (MethodInfo m1 in m) 
      Console.WriteLine("Mthod name:" + m1.Name + " \nMethod return type:" + m1.ReturnType + "\nIs staic:" + m1.IsStatic + "\nIs Public:" + m1.IsPublic + "\nIs Private:" + m1.IsPrivate); 
     FieldInfo[] f = t.GetFields(); 
     Console.WriteLine("\n\nField Information:-\n\n"); 
     foreach(FieldInfo f1 in f) 
      Console.WriteLine("Field name:" + f1.Name + " \nField type:" + f1.FieldType + "\nIs staic:" + f1.IsStatic); 
     Console.Read(); 
    } 
0

इसके लिए एक विस्तार विधि लिखें:

public static class ReflectionExt 
{ 
    public static readonly List<AccessModifier> AccessModifiers = new List<AccessModifier> 
    { 
     AccessModifier.Private, 
     AccessModifier.Protected, 
     AccessModifier.Internal, 
     AccessModifier.Public 
    }; 

    public static AccessModifier Accessmodifier(this PropertyInfo propertyInfo) 
    { 
     if (propertyInfo.SetMethod == null) 
      return propertyInfo.GetMethod.Accessmodifier(); 
     if (propertyInfo.GetMethod == null) 
      return propertyInfo.SetMethod.Accessmodifier(); 
     var max = Math.Max(AccessModifiers.IndexOf(propertyInfo.GetMethod.Accessmodifier()), 
      AccessModifiers.IndexOf(propertyInfo.SetMethod.Accessmodifier())); 
     return AccessModifiers[max]; 
    } 

    public static AccessModifier Accessmodifier(this MethodInfo methodInfo) 
    { 
     if (methodInfo.IsPrivate) 
      return AccessModifier.Private; 
     if (methodInfo.IsFamily) 
      return AccessModifier.Protected; 
     if (methodInfo.IsAssembly) 
      return AccessModifier.Internal; 
     if (methodInfo.IsPublic) 
      return AccessModifier.Public; 
     throw new ArgumentException("Did not find access modifier", "methodInfo"); 
    } 
} 
public enum AccessModifier 
{ 
    Private, 
    Protected, 
    Internal, 
    Public 
} 
संबंधित मुद्दे