2009-08-28 8 views
8

Я создал пользовательский атрибут здесь с именем AAtribute и, например, класс B, где один или несколько методов используют этот атрибут. Можно ли получить MethodInfo метода, который содержит атрибут (в данном случае BMethod1) как (один из) его атрибутов, не проходя через всю сборку и не глядя на все определенные методы для своих атрибутов? И является ли он аналоговым способом для других атрибутов (Параметры/Типы/Свойства/...)? Мне не нужен массив всех методов, которые используют этот тип атрибута, но только метод с этим объектом Attirbute в частности. Я хочу использовать его для установки дополнительных ограничений на метод (тип возврата, параметр, имя, другое использование атрибута, ...).Быстрый доступ к типу/методу/... который содержит атрибут в C#

[AttributeUsage(AttributeTargets.Method)] 
public class AAtribute : Attribute { 

    //some fields and properties 

    public AAtribute() {//perhaps with some parameters 
     //some operations 
     MethodInfo mi;//acces to the MethodInfo with this Attribute 
         //as an Attribute (the question) 
     //some operations with the MethodInfo 
    } 

    //some methods 

} 

public class B { 

    //some fields, properties and constructors 

    [A] 
    public void BMethod1() { 
     //some operations 
    } 

    //other methods 

} 
+0

Хороший вопрос, я тоже хотел бы знать ответ ... –

ответ

2

Если я правильно понял ваш вопрос, вы хотите получить, внутри кода атрибута, объект (метод в данном случае), к которому применяется атрибут.
Я уверен, что нет прямого способа сделать это - атрибут не знает об объекте, к которому он привязан, эта связь является наоборот.

Лучшее, что я могу предложить вам обходной путь, как в следующем:

using System; 
using System.Reflection; 

namespace test { 

    [AttributeUsage(AttributeTargets.Method)] 
    public class AAttribute : Attribute { 
     public AAttribute(Type type,string method) { 
      MethodInfo mi = type.GetMethod(method); 
     } 
    } 

    public class B { 
     [A(typeof(B),"BMethod1")] 
     public void BMethod1() { 
     } 
    } 
} 

ПРИМЕЧАНИЕ
Что вы хотите достичь путем доступа к MethodInfo внутри конструктора атрибута? Может быть, есть альтернативный способ получения своей цели ...

EDIT

В качестве другого возможного решения, вы можете предоставить статический метод в атрибуте, который делает проверку - но это предполагает итерацию над MethodInfos.

using System; 
using System.Reflection; 
namespace test { 

    [AttributeUsage(AttributeTargets.Method)] 
    public class AAttribute : Attribute { 
     public static void CheckType<T>() { 
      foreach (MethodInfo mi in typeof(T).GetMethods()) { 
       AAttribute[] attributes = (AAttribute[])mi.GetCustomAttributes(typeof(AAttribute), false); 
       if (0 != attributes.Length) { 
        // do your checks here 
       } 
      } 
     } 
    } 

    public class B { 
     [A] 
     public void BMethod1() { 
     } 
     [A] 
     public int BMethod2() { 
      return 0; 
     } 
    } 

    public static class Program { 
     public static void Main() { 
      AAttribute.CheckType<B>(); 
     } 
    } 
} 
+0

Как я уже сказал, я хочу наложить на него ограничения additiol (тип возврата, количество параметров, типы параметров, имя метода, ...). Если метод недействителен, может быть выбрано исключение. Но какова бы ни была причина, не было бы логичным, чтобы вы могли получить доступ к тому, с чем связан атрибут? –

+0

Да, но что вы хотите сделать с этими ограничениями? Атрибут не будет создан, пока вы не попытаетесь отразить тип в любом случае. –

0

Чтобы узнать, применим ли к нему метод, у вас уже есть MethodInfo.

var type = obj.GetType(); 
foreach(var method in type.GetMethods()) 
{ 
    var attributes = method.GetCustomAttributes(typeof(AAtribute)); 
    if(attributes.Length > 0) 
    { 
     //this method has AAtribute applied at least once 
    } 
}

+0

Да, но как вы это делаете изнутри атрибута? Есть ли способ узнать, к какому методу (или члену) применяется текущий экземпляр атрибута? –

2

Я думаю, что ответ отрицательный. Или, по крайней мере, не разумно. Экземпляр атрибута создается только после поиска атрибута через MethodInfo. Создание экземпляра класса, у которого есть метод с атрибутом, не будет создавать атрибут. Экземпляры атрибутов создаются только после того, как вы начнете копаться, чтобы найти их через отражение.