2009-08-28 9 views
8

Wprowadziłem tutaj niestandardowy Atrybut o nazwie AAtribute, i na przykład klasę o nazwie B, w której jedna lub więcej metod używa tego atrybutu. Czy możliwe jest uzyskanie metody MethodInfo metody, która przechowuje atrybut (w tym przypadku BMethod1) jako (jeden z) jego atrybutów bez przechodzenia przez cały zestaw i analizowania wszystkich zdefiniowanych metod dla ich atrybutów? I czy jest to metoda analogiczna do innych atrybutów AttributeTarget (Parametry/Typy/Właściwości/...)? Nie chcę zestawu wszystkich metod, które używają tego typu Atrybutu, ale tylko metody z tym obiektem Attirbute w szczególności. Chcę go użyć do wprowadzenia dodatkowych ograniczeń dla metody (typ zwracania, parametr, nazwa, inne użycie atrybutu, ...).Szybki dostęp do typu/metody/... posiadającego atrybut w 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

Dobre pytanie, ja też chciałbym znać odpowiedź ... –

Odpowiedz

2

Jeśli dobrze zrozumiałam Twoje pytanie, chcesz się dostać, wewnątrz kodu atrybutu, obiekt (metoda w tym przypadku), do których stosuje się atrybut.
Jestem prawie pewien, że nie ma bezpośredniego sposobu, aby to zrobić - atrybut nie ma wiedzy o obiekcie, do którego jest dołączony, to skojarzenie jest odwrotnie.

Najlepszym mogę zaproponować ci to obejście tak:

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() { 
     } 
    } 
} 

UWAGA
Co chcesz osiągnąć poprzez dostęp MethodInfo wewnątrz konstruktora atrybutu? Może istnieje alternatywny sposób, aby uzyskać swój cel ...

EDIT

W innym możliwym rozwiązaniu, można dostarczyć metody statycznej w swoim atrybutem, dokłada sprawdzanie - ale wiąże się to z Iterowanie nad 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

Tak jak już powiedziałem, chcę umieścić na nim ograniczenia additiol (typ zwracany, liczba parametrów, typy parametrów, nazwa metody, ...). Jeśli metoda nie jest prawidłowa, może zostać zgłoszony wyjątek. Ale niezależnie od przyczyny, czy nie logiczne jest, że możesz uzyskać dostęp do rzeczy, do której jest podłączony atrybut? –

+0

Tak, ale co chcesz zrobić z tymi ograniczeniami? Atrybut nie zostanie utworzony, dopóki nie spróbujesz odzwierciedlić typu. –

0

Aby dowiedzieć się, czy dana metoda ma zastosowany atrybut, masz już 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

Tak, ale jak to zrobić z wnętrza atrybutu? Czy istnieje sposób sprawdzenia, do jakiej metody (lub członka) zastosowano bieżące wystąpienie atrybutu? –

2

Myślę, że odpowiedź brzmi nie. A przynajmniej nie w rozsądny sposób. Instancja atrybutu jest konstruowana tylko wtedy, gdy szukasz atrybutu za pomocą MethodInfo. Wypisywanie klasy, która ma metodę, która ma atrybut, nie tworzy instancji tego atrybutu. Atrybuty instancji są tworzone tylko po rozpoczęciu grzebania w celu znalezienia ich poprzez odbicie.