2011-06-17 17 views
7

विधियों को ओवरलोड होने पर कक्षा विधियों और इंटरफ़ेस विधियों से विशेषता मान प्राप्त करने का सबसे अच्छा तरीका क्या है?इंटरफ़ेस विधियों और कक्षा विधियों से गुण प्राप्त करें

उदाहरण के लिए मैं जानना चाहता हूं कि निम्न उदाहरण में एक पैरामीटर के साथ प्राप्त विधि में दो विशेषताएं हैं और मान 5 और "कोई" हैं जबकि अन्य विधि के मूल्य 7 और "निजी" के साथ विशेषता है।

public class ScopeAttribute : System.Attribute 
{ 
    public string Allowed { get; set; }  
} 

public class SizeAttribute : System.Attribute 
{ 
    public int Max { get; set; } 
} 

public interface Interface1 
{ 
    [SizeAttribute(Max = 5)] 
    string Get(string name); 

    [SizeAttribute(Max = 7)] 
    string Get(string name, string area); 

} 

public class Class1 : Interface1 
{ 
    [ScopeAttribute(Allowed = "any")] 
    public string Get(string name) 
    { 
     return string.Empty; 
    } 

    [ScopeAttribute(Allowed = "private")] 
    public string Get(string name, string area) 
    { 
     return string.Empty; 
    } 
} 

उत्तर

1

आप उपयोग कर सकते हैं TypeDescriptor API

System.ComponentModel.TypeDescriptor.GetAttributes(object) 
+1

क्या इसका मतलब यह नहीं होगा कि मुझे पहले कक्षा को तुरंत चालू करना है? और क्या यह ऑब्जेक्ट विधियों के गुणों के बजाय ऑब्जेक्ट गुण प्रदान करेगा? –

0

आप कस्टम विशेषताओं को महत्व देता है प्राप्त करने के लिए प्रतिबिंब का उपयोग करना चाहिए

उपयोग MemberInfo.GetCustomAttributes Method कस्टम विशेषताओं अपने सदस्य से जुड़ी

यहाँ

एक है वापस जाने के लिए ट्यूटोरियल http://msdn.microsoft.com/en-us/library/aa288454(v=VS.71).aspx

संपादित करें: इंटरफ़ेस से गुण प्राप्त करने के लिए here

+0

यह यहां पर्याप्त नहीं है। इस विधि के साथ आप उदाहरण से 'स्कोपएट्रिब्यूट' प्राप्त कर सकते हैं। कार्यान्वित इंटरफ़ेस और 'SizeAttribute' के लिए यह पर्याप्त नहीं है। –

0

आपको प्रतिबिंब का उपयोग करना चाहिए। आप इस उदाहरण का उपयोग कर सकते हैं:

static void Main(string[] args) 
{ 
    Class1 testClass = new Class1(); 
    Type type = testClass.GetType(); 

    foreach(MethodInfo mInfo in type.GetMethods()) 
    { 
     foreach (Attribute attr in Attribute.GetCustomAttributes(mInfo)) 
    { 
     Console.WriteLine("Method {0} has a {1} attribute.", 
      mInfo.Name, attr.GetType().Name); 
    } 
    } 
} 
2

एक ही रास्ता मैंने पाया क्या वर्ग औजार इंटरफेस की जाँच करें और उन इंटरफेस पर जाँच संपत्ति की विशेषताओं (अगर मौजूद हैं) करने के लिए, उदाहरण के लिए था (नोट - समग्र दृष्टिकोण परीक्षण किया जाता है लेकिन कोड में ही तदर्थ है और संकलन नहीं कर सकते हैं :)

static bool HasAttribute (PropertyInfo property, string attribute) { 
    if (property == null) 
    return false; 

    if (GetCustomAttributes().Any (a => a.GetType().Name == attribute)) 
    return true; 

    var interfaces = property.DeclaringType.GetInterfaces(); 

    for (int i = 0; i < interfaces.Length; i++) 
    if (HasAttribute (interfaces[i].GetProperty (property.Name), attribute)) 
     return true; 

    return false; 
} 

आप शायद तरीकों समान रूप से आसान करने के लिए इसे गोद ले सकते हैं।

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