Получите атрибуты от методов интерфейса и методов класса - PullRequest
9 голосов
/ 17 июня 2011

Каков наилучший подход для получения значений атрибутов из методов классов и методов интерфейса, когда методы перегружены?

Например, я хотел бы знать, что в следующем примере метод Get с одним параметром имеет два атрибута, значения 5 и «любой», в то время как другой метод имеет атрибуты со значениями 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 ]

4 голосов
/ 21 августа 2014

Единственным способом, который я нашел, было проверить, какие интерфейсы реализует класс, и проверить атрибуты свойства (если они существуют) на этих интерфейсах, например, (примечание - общий подход проверен, но сам код является специальным и может не компилироваться:)

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 голос
/ 17 июня 2011

Вы можете использовать API TypeDescriptor

System.ComponentModel.TypeDescriptor.GetAttributes(object)
0 голосов
/ 11 июня 2014

Вы должны использовать отражение.Вы можете использовать этот пример:

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);
     }
   }
}
0 голосов
/ 17 июня 2011

Вы должны использовать отражение, чтобы получить значения пользовательских атрибутов

используйте MemberInfo.GetCustomAttributes Метод для возврата пользовательских атрибутов, прикрепленных к вашему члену

вот учебник http://msdn.microsoft.com/en-us/library/aa288454(v=VS.71).aspx

РЕДАКТИРОВАТЬ: для получения атрибутов из интерфейса смотрите здесь

...