2011-02-03 15 views
10

मैं एक कस्टम लिखा है विशेषता है कि मैं एक वर्ग के कुछ सदस्यों पर का उपयोग करें:कस्टम विशेषता-सजाए गए संपत्ति से मूल्य प्राप्त करें?

public class Dummy 
{ 
    [MyAttribute] 
    public string Foo { get; set; } 

    [MyAttribute] 
    public int Bar { get; set; } 
} 

मैं कस्टम प्रकार से जिम्मेदार बताते हो और मेरी विशिष्ट विशेषता ढूँढने में सक्षम हूँ। असाइन किए गए गुणों के मूल्य प्राप्त करने के लिए मैं क्या नहीं कर सकता हूं। जब मैं डमी का उदाहरण लेता हूं और अपनी विधि में इसे (ऑब्जेक्ट के रूप में) पास करता हूं, तो मैं प्रॉपर्टीइन्फो ऑब्जेक्ट को कैसे प्राप्त कर सकता हूं, मैं वापस प्राप्त करता हूं। गेटप्रॉपर्टीज() और मूल्यों को सौंपा गया है। फू और बार?

संपादित करें:

मेरे समस्या यह है कि मैं समझ नहीं कैसे ठीक getValue कॉल करने के लिए है।

void TestMethod (object o) 
{ 
    Type t = o.GetType(); 

    var props = t.GetProperties(); 
    foreach (var prop in props) 
    { 
     var propattr = prop.GetCustomAttributes(false); 

     object attr = (from row in propattr where row.GetType() == typeof(MyAttribute) select row).First(); 
     if (attr == null) 
      continue; 

     MyAttribute myattr = (MyAttribute)attr; 

     var value = prop.GetValue(prop, null); 
    } 
} 

हालांकि, जब मैं यह कर, prop.GetValue कॉल मुझे एक TargetException देता है - वस्तु लक्ष्य प्रकार से मेल नहीं खाता। इस मूल्य को पाने के लिए मैं इस कॉल को कैसे बना सकता हूं?

उत्तर

11

आपका जरूरत getValue करने के लिए वस्तु ही पारित करने के लिए है, न कि एक संपत्ति वस्तु:

var value = prop.GetValue(o, null); 

और एक और बात - आपको इसका उपयोग नहीं करना चाहिए। सबसे पहले(), लेकिन .FirstOrDefault(), क्योंकि आपका कोड एक उत्कृष्ट फेंक देगा eption, अगर कुछ संपत्ति में कोई विशेषता नहीं है:

object attr = (from row in propattr 
       where row.GetType() == typeof(MyAttribute) 
       select row) 
       .FirstOrDefault(); 
+0

फर्स्टऑर्डफॉल्ट पर सहमति - यह समस्या का प्रदर्शन करने के लिए ज्यादातर एक मिश्रित उदाहरण है, लेकिन सहायता के लिए धन्यवाद। दुह, विश्वास नहीं कर सकता कि यह था। – Joe

3

आप .GetProperties() का उपयोग कर PropertyInfo की सरणी हो और प्रत्येक

कॉल पर PropertyInfo.GetValue विधि कॉल यह इस तरह से:

var value = prop.GetValue(o, null); 
+0

स्पष्टीकरण के लिए; ओपी को संपत्ति मूल्य प्राप्त करने के लिए डमी क्लास का एक उदाहरण चाहिए। एक प्रकार स्वयं ही पर्याप्त नहीं है। – KeithS

+0

मैंने अपना प्रश्न अपडेट कर लिया है - मेरी समस्या बिल्कुल ठीक है। नेटवैल्यू और इसे कैसे कॉल करें ताकि यह वास्तव में काम करे। – Joe

+1

@ जो अपडेट देखें – Andrey

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