2012-06-22 2 views
9

निम्नलिखित वर्ग पर विचार के बिना एक प्रकार का एक स्टेटिक संपत्ति का मूल्य प्राप्त करने केमैं प्रतिबिंब का उपयोग कर सकते कैसे एक ठोस उदाहरण

public class AnotherClass<T> 
    where T : ISomeInterface 
{ 

} 

जो मैं उदाहरण के माध्यम से:

AnotherClass<AClass> genericClass = new AnotherClass<AClass>(); 

मैं अपने genericClass के भीतर से AClass.AProperty के स्थिर मूल्य प्राप्त कर सकते हैं AClass का एक ठोस उदाहरण के बिना?

उत्तर

10

कुछ

तरह
typeof(AClass).GetProperty("AProperty").GetValue(null, null) 

करेंगे। int पर कास्ट करना न भूलें।

प्रलेखन लिंक: http://msdn.microsoft.com/en-us/library/b05d59ty.aspx (वे भी स्थिर गुणों के साथ उदाहरण मिल गया है।) लेकिन अगर आप वास्तव में AClass पता है, तुम सिर्फ AClass.AProperty उपयोग कर सकते हैं।

आप AnotherClass<T> अंदर T = AClass के लिए, आप T के रूप में यह उल्लेख कर सकते हैं कर रहे हैं:

typeof(T).GetProperty("AProperty").GetValue(null, null) 

यदि आप सुनिश्चित करें कि आपके T स्थिर संपत्ति AProperty है के लिए पता है काम करेंगे। अगर कोई गारंटी नहीं है कि ऐसी संपत्ति किसी भी T पर मौजूद है, तो आपको रास्ते पर वापसी मान/अपवादों की जांच करनी होगी।

अगर केवल AClass आप के लिए दिलचस्प है, आप की तरह

if (typeof(T) == typeof(AClass)) 
    n = AClass.AProperty; 
else 
    ??? 
+0

ग्रेट चाहते हैं। अब एकमात्र मुद्दा जो मैंने पाया है वह यह है कि मैं इंटरफ़ेस में स्थिर संपत्ति को परिभाषित नहीं कर सकता, जिसे इसे करने की आवश्यकता है। मुझे लगता है कि मैं एक गैर स्थैतिक संपत्ति और एक स्थिर संपत्ति को एक ही मूल्य लौटा सकता हूं, एक उदाहरण के लिए उपयोग करने के लिए और किसी को इस प्रकार संदर्भित किया जा सकता है? या फिर इसके चारों ओर एक और रास्ता है? –

+0

वैकल्पिक रूप से मैं नई टी() एप्रोपर्टी का उपयोग करके गैर स्थैतिक संपत्ति प्राप्त कर सकता हूं, लेकिन ऐसा लगता है कि यह खराब अभ्यास होगा। तुम क्या सोचते हो? –

+0

@ स्टीवर्ट: ठीक है, एक नया 'टी' बनाना महंगा हो सकता है। यह एक दयालु बात है कि इंटरफेस में वास्तव में स्थिर चीजें शामिल नहीं हो सकती हैं। – Vlad

1

कुछ का उपयोग कर सकते सबसे पहले अपने AnotherClass उदाहरण के जेनेरिक प्रकार मिलता है।

फिर स्थैतिक संपत्ति प्राप्त करें।

फिर संपत्ति का स्थिर मूल्य प्राप्त करें।

// I made this sealed to ensure that `this.GetType()` will always be a generic 
// type of `AnotherClass<>`. 
public sealed class AnotherClass<T> 
{ 
    public AnotherClass(){ 
     var aPropertyValue = ((PropertyInfo) 
       this.GetType() 
        .GetGenericArguments()[0] 
        .GetMember("AProperty")[0]) 
      .GetValue(null, null); 
    } 
} 

को स्वीकार करते हुए, जाहिर है, कि यह संभव सुनिश्चित करना है कि "AProperty" मौजूद नहीं है, क्योंकि इंटरफेस स्थिर हस्ताक्षर पर काम नहीं करते, मैं समाधान के लिए अप्रासंगिक होने के रूप में ISomeInterface हटा दिया।