2015-12-30 15 views
5

मैं एक ऐसा फ़ंक्शन बनाने की कोशिश कर रहा हूं जो उसके ऑब्जेक्ट से फ़ील्ड लौटा सके।नाम से क्षेत्र प्राप्त करें

यहां तक ​​कि मेरे पास अब तक है।

public class Base 
{ 
    public string thing = "Thing"; 
    public T GetAttribute<T>(string _name) 
    { 
     return (T)typeof(T).GetProperty(_name).GetValue(this, null); 
    } 
} 

मैं क्या पसंद आदर्श हैं कॉल करने के लिए है:

string thingy = GetAttribute<string>("thing"); 

लेकिन मुझे लगता है मैं छड़ी के गलत छोर मिला, जब इस पर पढ़ने क्योंकि मैं अशक्त संदर्भ अपवाद मिलती रहती है।

+0

निम्नलिखित जवाब का प्रयोग करें [यहां] से (http://stackoverflow.com/questions/1196991/get-property-value-from-string-using-reflection-in-c-sharp) –

+1

ध्यान दें कि सी # में, 'विशेषता' शब्द में एक है विशिष्ट अर्थ: यह मेटा-डेटा का एक टुकड़ा है जिसे अन्य चीजों के साथ कक्षाओं या विधियों से जोड़ा जा सकता है। ऐसा नहीं है कि आपका प्रश्न क्या है - सही शब्द यह होगा कि आप 'फ़ील्ड' या 'प्रॉपर्टी' के मूल्य प्राप्त करने के लिए 'प्रतिबिंब' का उपयोग कर रहे हैं। –

उत्तर

3

पहली बात - thing एक क्षेत्र है, न कि संपत्ति।

एक और बात यह है कि आप पैरामीटर प्रकार बदलने के लिए करने के लिए यह काम कर रहा दे दी है:

public class Base { 

    public string thing = "Thing"; 

    public T GetAttribute<T> (string _name) { 
     return (T)typeof(Base).GetField(_name).GetValue (this, null); 
    } 
} 

Btw - आप एक उदाहरण का हवाला संपत्ति/फ़ील्ड मान प्राप्त कर सकते हैं:

var instance = new Base(); 
var value = instance.thing; 
+0

आपको बहुत बहुत धन्यवाद, यह एक आकर्षण काम करता है! मेरे पास केवल एक मुद्दा है, जो मेरी गलती है कि पहले उल्लेख नहीं किया जा रहा है, बेस को अन्य चीजों से विरासत में लाया जा रहा है, क्या एक प्रकार का "टाइपोफ (यह)" प्रकार कहने का कोई तरीका है? – inadequateMonkey

+0

बीटीडब्लू के लिए भी धन्यवाद, मुझे पता है कि यह बेहद अजीब लगता है लेकिन इसकी आवश्यकता के लिए एक बहुत लंबा और जटिल कारण है, मैं इसमें नहीं जाऊंगा :) – inadequateMonkey

+1

@inadequateMonkey 'type.GetType()' टाइप टाइप (बेस ') ' –

5

thing एक क्षेत्र नहीं है। आपको GetProperty के बजाय GetField विधि का उपयोग करना चाहिए। एक और समस्या यह है कि आप typeof(T) में देख रहे हैं। आपको typeof(Base) में फ़ील्ड की तलाश करनी चाहिए।

पूरे समारोह

public T GetAttribute<T>(string _name) 
{ 
    return (T)GetType().GetField(_name).GetValue(this); 
} 

को बदला जाना चाहिए आप आप उपयोग कर सकते हैं इस

public static class Ex 
{ 
    public static TFieldType GetFieldValue<TFieldType, TObjectType>(this TObjectType obj, string fieldName) 
    { 
     var fieldInfo = obj.GetType().GetField(fieldName, 
      BindingFlags.Instance | BindingFlags.Static | 
      BindingFlags.Public | BindingFlags.NonPublic); 
     return (TFieldType)fieldInfo.GetValue(obj); 
    } 
} 

की तरह इसका इस्तेमाल एक प्रकार के क्षेत्र मूल्य प्राप्त करने के एक विस्तार विधि करना चाहते हैं
var b = new Base(); 
Console.WriteLine(b.GetFieldValue<string, Base>("thing")); 

BindingFlags का उपयोग करके क्षेत्रीय मूल्य प्राप्त करने में आपकी सहायता मिलेगी, भले ही यह निजी हो ते या स्थिर क्षेत्र।

+0

क्या आप डाउनवोट के कारण की व्याख्या कर सकते हैं ताकि मैं अपना जवाब सुधार सकूं? – dotctor

+0

यह किसी समस्या का केवल एक हिस्सा हल करता है - पैरामीटर प्रकार के साथ स्पष्ट रूप से समस्याएं हैं। – Kamo

+0

धन्यवाद, मैंने इसे बदल दिया: वापसी (टी) टाइपोफ (टी) .GetField (_name) .GetValue (यह); लेकिन अभी भी कोई खुशी नहीं – inadequateMonkey

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