2011-06-17 35 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; 
} 

你或许可以通过它的方法同样简单。