.net - प्रतिबिंब के साथ एक स्थिर संपत्ति कैसे प्राप्त करें




reflection static (6)

इस सी # प्रतिबिंब लिंक का प्रयास करें।

नोट मुझे लगता है कि बाइंडिंगफ्लैग्सइंस्टेंस और बाइंडिंगफ्लैग्सस्टेटिक अनन्य हैं।

तो यह बहुत बुनियादी लगता है लेकिन मैं इसे काम नहीं कर सकता। मेरे पास एक ऑब्जेक्ट है, और मैं इसके सार्वजनिक गुणों को प्राप्त करने के लिए प्रतिबिंब का उपयोग कर रहा हूं। इन गुणों में से एक स्थिर है और मुझे इसमें कोई भाग्य नहीं है।

Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo
    Return obj.GetType.GetProperty(propName)

End Function

उपर्युक्त कोड सार्वजनिक इंस्टेंस गुणों के लिए ठीक काम करता है, जो अब तक की जरूरत है। माना जाता है कि मैं अन्य प्रकार के गुणों (निजी, स्थैतिक) का अनुरोध करने के लिए बाध्यकारीफ्लैग का उपयोग कर सकता हूं, लेकिन मुझे सही संयोजन नहीं मिल रहा है।

Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo
    Return obj.GetType.GetProperty(propName, Reflection.BindingFlags.Static Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public)

End Function

लेकिन फिर भी, किसी भी स्टेटिक सदस्यों से अनुरोध करने से कुछ भी वापस नहीं आती है। .NET परावर्तक स्थिर गुणों को ठीक देख सकता है, इसलिए स्पष्ट रूप से मुझे यहां कुछ याद आ रहा है।


ठीक है तो मेरे लिए कुंजी का उपयोग करना था। FlattenHierarchy BindingFlag। मैं वास्तव में नहीं जानता कि मैंने इसे अभी एक झुकाव क्यों जोड़ा और यह काम करना शुरू कर दिया। तो अंतिम समाधान जो मुझे सार्वजनिक उदाहरण या स्टेटिक गुण प्राप्त करने की अनुमति देता है:

obj.GetType.GetProperty(propName, Reflection.BindingFlags.Public _
  Or Reflection.BindingFlags.Static Or Reflection.BindingFlags.Instance Or _
  Reflection.BindingFlags.FlattenHierarchy)

नीचे मेरे लिए काम करता प्रतीत होता है।

using System;
using System.Reflection;

public class ReflectStatic
{
    private static int SomeNumber {get; set;}
    public static object SomeReference {get; set;}
    static ReflectStatic()
    {
        SomeReference = new object();
        Console.WriteLine(SomeReference.GetHashCode());
    }
}

public class Program
{
    public static void Main()
    {
        var rs = new ReflectStatic();
        var pi = rs.GetType().GetProperty("SomeReference",  BindingFlags.Static | BindingFlags.Public);
        if(pi == null) { Console.WriteLine("Null!"); Environment.Exit(0);}
        Console.WriteLine(pi.GetValue(rs, null).GetHashCode());


    }
}

यह सी # है, लेकिन आपको यह विचार देना चाहिए:

public static void Main() {
    typeof(Program).GetProperty("GetMe", BindingFlags.NonPublic | BindingFlags.Static);
}

private static int GetMe {
    get { return 0; }
}

(आपको केवल या गैर-सार्वजनिक और स्टेटिक की आवश्यकता है)


TypeInfo आधार पर नई प्रतिबिंब एपीआई का उपयोग करते समय बस अपने लिए यह स्पष्ट करना चाहता था - जहां TypeInfo विश्वसनीय रूप से उपलब्ध नहीं है (लक्ष्य ढांचे के आधार पर)।

'नए' प्रतिबिंब में, एक प्रकार के लिए स्थैतिक गुण प्राप्त करने के लिए (बेस क्लास (एसएस) सहित) आपको कुछ ऐसा करना है:

IEnumerable<PropertyInfo> props = 
  type.GetTypeInfo().DeclaredProperties.Where(p => 
    (p.GetMethod != null && p.GetMethod.IsStatic) ||
    (p.SetMethod != null && p.SetMethod.IsStatic));

केवल पढ़ने के लिए या केवल लिखने वाले गुणों के लिए कैटर (लिखने के बावजूद केवल एक भयानक विचार है)।

DeclaredProperties सदस्य भी सार्वजनिक / निजी एक्सेसर्स के साथ संपत्तियों के बीच अंतर नहीं करता है - इसलिए दृश्यता के आसपास फ़िल्टर करने के लिए, आपको उस एक्सेसर के आधार पर ऐसा करने की आवश्यकता है जिसका उपयोग करने के लिए आपको आवश्यकता है। उदाहरण के लिए - उपर्युक्त कॉल वापस आ गया है, आप कर सकते हैं:

var publicStaticReadable = props.Where(p => p.GetMethod != null && p.GetMethod.IsPublic);

कुछ शॉर्टकट विधियां उपलब्ध हैं - लेकिन आखिरकार हम भविष्य में TypeInfo क्वेरी विधियों / गुणों के आस-पास बहुत अधिक विस्तार विधियां लिखने जा रहे हैं। साथ ही, नई एपीआई हमें इस बारे में सोचने के लिए मजबूर करती है कि हम अब से 'निजी' या 'सार्वजनिक' संपत्ति के रूप में क्या सोचते हैं - क्योंकि हमें व्यक्तिगत एक्सेसर्स के आधार पर खुद को फ़िल्टर करना होगा।


myType.GetProperties(BindingFlags.Public | BindingFlags.Static |  BindingFlags.FlattenHierarchy);

यह स्थैतिक बेस क्लास या किसी विशेष प्रकार और शायद बच्चे में भी सभी स्थिर गुणों को वापस कर देगा।





static