从接口方法和类方法中获取属性

时间:2011-06-17 01:23:02

标签: c# reflection custom-attributes

当方法重载时,从类方法和接口方法获取属性值的最佳方法是什么?

例如,我想知道在下面的示例中,带有一个参数的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;
    }
}

4 个答案:

答案 0 :(得分:3)

我找到的唯一方法是检查类实现的接口,并检查这些接口上属性的属性(如果存在),例如(注意 - 整体方法已经过测试,但代码本身是临时的,可能无法编译:)

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

您可以将它用于方法同样容易。

答案 1 :(得分:1)

您可以使用TypeDescriptor API

System.ComponentModel.TypeDescriptor.GetAttributes(object)

答案 2 :(得分:0)

您应该使用反射来获取自定义属性值

使用MemberInfo.GetCustomAttributes Method返回附加到您的会员的自定义属性

这是一个教程http://msdn.microsoft.com/en-us/library/aa288454(v=VS.71).aspx

编辑:从界面获取属性查看here

答案 3 :(得分: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);
     }
   }
}