2016-02-22 3 views
0

Je veux être en mesure de vérifier la présence d'un attribut personnalisé sur une instance d'une classe, mais je veux être en mesure d'effectuer cette vérification depuis le constructeur de cette classe. Jetez un oeil à ce pseudo-code:Comment puis-je savoir si une variable d'instance utilisant une interface a un attribut personnalisé appliqué?

namespace TestPackage 
{ 
    public class MyAttribute : Attribute { } 
    public interface IMyThing { } 

    public class MyThing : IMyThing 
    { 
     private bool HasMyAttribute { get; set; } 

     public MyThing() 
     { 
      if (/* some check for custom attribute */) 
      { 
       HasMyAttribute = true; 
      } 
     } 
    } 

    public class MyWrapper 
    { 
     [MyAttribute] 
     private readonly IMyThing _myThing; 

     public MyWrapper() 
     { 
      _myThing = new MyThing(); 
     } 
    } 
} 

Le if où j'ai le commentaire de code est ce que je voudrais remplir Est-ce possible.?

+5

Non, ce n'est pas possible. L'attribut n'est pas appliqué à l'instance de la classe, il est appliqué au champ. – Amy

+1

Cela me semble un anti-pattern ... – lintmouse

+0

Les attributs sont définis statiquement dans le code et sont donc statiques, ils ne sont pas liés aux instances. Ils sont appliqués à un type ou à des membres de ce type. –

Répondre

2

Les attributs sont définis de manière statique dans le code et sont donc statiques, ils ne sont pas liés aux instances. Ils sont appliqués à un type ou à des membres de ce type.

Dans votre cas, votre encapsuleur peut implémenter IMyThing et l'utiliser à la place du type d'origine, puis appliquer l'attribut à la classe.

[MyAttribute] 
public class MyWrapper : IMyThing 
{ 
    private readonly IMyThing _myThing; 

    public MyWrapper() 
    { 
     _myThing = new MyThing(); 
    } 

    public void DoMyThingStuff() 
    { 
     _myThing.DoMyThingStuff(); 
    } 
} 

Et vous pouvez vérifier l'attribut comme ceci:

bool CheckAttribute(IMyThing myThing) 
{ 
    Type t = myThing.GetType(); 
    return t.GetCustomAttributes(typeof(MyAttribute), false).Length > 0; 
} 

Si un objet de la classe d'origine est passé, vous obtenez false. Si un objet wrapper est passé, vous obtenez true.

Vous pouvez également dériver une classe de la classe d'origine au lieu de créer un wrapper.

[MyAttribute] 
public class MyDerived : MyThing 
{ 
} 
-1

Utilisez ce constructeur:

public MyThing 
{ 
       HasMyAttribute =false; 
       foreach (MemberInfo item in this.GetType().GetCustomAttributes(false)) 
       { 
         if(item.Name=="MyAttribute") 
          HasMyAttribute =true; 
       } 

} 
+0

Ceci est une réponse manifestement fausse. –

+0

La réponse qui a été marquée comme réponse est presque la même approche – nAviD