2012-02-06 7 views
5

मैं एक वर्गसी # में, यदि एक वर्ग एक (प्रतिबिंब का उपयोग) संपत्ति है

public class Car 
{ 
     public string Name {get;set;} 
     public int Year {get;set;} 
} 

अलग कोड में है पता लगाने के लिए सबसे अच्छा तरीका क्या है, मैं स्ट्रिंग के रूप में के रूप में एक क्षेत्र का नाम (उपयोग करते हैं एक उदाहरण के रूप में "वर्ष")।

मैं इस

if (Car.HasProperty("Year")) 

जो यह पता लगाने होगा अगर वहाँ कार वस्तु पर एक वर्ष क्षेत्र है की तरह कुछ करना चाहते हैं। यह सच हो जाएगा।

if (Car.HasProperty("Model")) 

झूठी वापसी होगी।

मैं गुणों के माध्यम से लूप को कोड देखता हूं लेकिन यह देखना चाहता था कि कोई भी क्षेत्र मौजूद है या नहीं, यह निर्धारित करने के लिए एक और संक्षिप्त तरीका था।

+4

'हैप्रप्रोपर्टी' एक बेहतर विधि नाम नहीं होगा? –

उत्तर

15

इस विस्तार विधि को यह करना चाहिए।

static public bool HasProperty(this Type type, string name) 
{ 
    return type 
     .GetProperties(BindingFlags.Public | BindingFlags.Instance) 
     .Any(p => p.Name == name); 
} 

आप गैर उदाहरण गुण, निजी संपत्तियों, या अन्य विकल्पों के लिए जाँच करने के लिए चाहता था, तो आप उस बयान में BindingFlags मूल्यों tweak कर सकते हैं। आपका उपयोग सिंटैक्स बिल्कुल वही नहीं होगा जो आप देते हैं। इसके बजाए:

if (typeof(Car).HasProperty("Year")) 
8

जब से तुम केवल public गुण की तलाश में हो रहे हैं, Type.GetProperty() काम कर सकते हैं:

if (typeof(Car).GetProperty("Year") != null) { 
    // The 'Car' type exposes a public 'Year' property. 
} 

आप आगे कोड ऊपर सार, आप Type class पर एक विस्तार विधि लिख सकते हैं करना चाहते हैं:

public static bool HasPublicProperty(this Type type, string name) 
{ 
    return type.GetProperty(name) != null; 
} 

तो इस तरह इसका इस्तेमाल:

if (typeof(Car).HasPublicProperty("Year")) { 
    // The 'Car' type exposes a public 'Year' property. 
} 

यदि आप गैर-public गुणों की उपस्थिति की जांच भी करना चाहते हैं, तो आपको Type.GetProperties() का ओवरराइड कॉल करना होगा जो BindingFlags तर्क लेता है, और परिणामों को फ़िल्टर करता है क्योंकि डेविड एम उनके उत्तर में करता है।

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