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


109

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

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

End Function

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

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 परावर्तक स्थिर गुणों को ठीक देख सकता है, इसलिए स्पष्ट रूप से मैं यहां कुछ याद कर रहा हूं।


यह वास्तव में, वास्तव में इसी के समान है: stackoverflow.com/questions/392122/…
ctacke

वैसे यह समान है कि वे दोनों BindingFlags का उपयोग करते हैं। मैं बाइंडफ्लैग्स के एक विशिष्ट संयोजन की तलाश में हूं जो मुझे सार्वजनिक सदस्य प्राप्त करने की अनुमति देगा, वे स्टैटिक या इंस्टेंस होंगे।
कोरी डाउनी

जवाबों:


129

या जरा ये देखिए ...

Type type = typeof(MyClass); // MyClass is static class with static properties
foreach (var p in type.GetProperties())
{
   var v = p.GetValue(null, null); // static classes cannot be instanced, so use null...
}

2
इन दो नल के कौन से चर हैं? नामांकित तर्कों का उपयोग करके आप इसे कैसे लिखेंगे, यदि यह संभव है? धन्यवाद।
हमीश ग्रुबीजन

आंतरिक स्थिर वर्ग के लिए?
किकेनेट

यह सबसे अच्छा विकल्प है, मेरी राय में इसे उत्तर के रूप में चुना जाना चाहिए।
c0y0teX 18

8
p.GetValue(null);काम भी करता है। दूसरे nullकी आवश्यकता नहीं है।
क्रोनो

अच्छा लग रहा है। लक्ष्य एक नाम तर्क के आधार पर संपत्ति प्राप्त करना था - मुझे नहीं लगता कि मैं इसे प्राप्त करने के लिए कभी भी संपत्ति पर लूप करना चाहता हूं।
कोरी डाउनी

42

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

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

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

(आपको केवल NonPublic और Static की आवश्यकता है)


3
मेरे मामले में, केवल इन दो झंडों का उपयोग करने से काम नहीं चला। मुझे .FlattenHierarchy ध्वज का भी उपयोग करना पड़ा।
कोरी डाउनी

3
@ कोरियोडनी सहमत हुए। BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchyकेवल एक चीज थी जो मेरे लिए काम करती थी।
जोनाथन रेनहार्ट

40

थोड़ी स्पष्टता ...

// Get a PropertyInfo of specific property type(T).GetProperty(....)
PropertyInfo propertyInfo;
propertyInfo = typeof(TypeWithTheStaticProperty)
    .GetProperty("NameOfStaticProperty", BindingFlags.Public | BindingFlags.Static); 

// Use the PropertyInfo to retrieve the value from the type by not passing in an instance
object value = propertyInfo.GetValue(null, null);

// Cast the value to the desired type
ExpectedType typedValue = (ExpectedType) value;

1
BindingFlags.Instance | BindingFlags.Staticमेरे लिए इसे हल किया।
लॉसमनोस

28

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

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

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

यह स्थिर आधार वर्ग या एक विशेष प्रकार और शायद बच्चे के रूप में सभी स्थिर गुणों को वापस कर देगा।


2

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

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

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

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

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

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

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


1

नीचे मेरे लिए काम करने लगता है।

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());


    }
}

-3

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

नोट मुझे लगता है कि BindingFlags.Instance और BindingFlags.Static अनन्य हैं।


हाँ, मैं उम्मीद कर रहा हूँ कि ऐसा नहीं है, क्योंकि मैं चाहता हूँ कि मैं किसी भी तरह का पब्लिक इंस्टेंस या स्टेटिक पा सकूँ।
कोरी डाउनी

वे अनन्य नहीं हैं। मैंने अभी इसका परीक्षण किया।
लॉसमनोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.