2011-06-17 63 views
7

當方法重載時,從類方法和接口方法獲取屬性值的最佳方法是什麼?從接口方法和類方法獲取屬性

例如,我想知道在下面的示例中,帶有一個參數的Get方法具有兩個屬性,值爲5和「any」,而另一個方法具有值爲7和「private」的屬性。

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

這不是意味着我必須先實例化類嗎?這會提供對象屬性而不是對象方法屬性? – 2011-06-19 22:05:33

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; 
} 

你或許可以通過它的方法同樣簡單。