8
votes

Accès rapide au type / méthode / ... qui contient un attribut en C #

J'ai fait un attribut personnalisé ici nommé Aatribute, et par exemple une classe appelée B où une ou plusieurs méthodes utilisent l'attribut. Est-il possible d'obtenir la méthodeInfo de la méthode qui contient l'attribut (dans ce cas BMETHOD1) comme (l'une des) ses attributs sans marcher dans l'ensemble de l'assemblage et la recherche de toutes les méthodes définies pour leurs attributs? Et est-il une voie analogique pour d'autres attributetaRgets (paramètres / types / propriétés / ...)? Je ne voudrais pas un tableau de toutes méthodes qui utilisent ce type d'attribut, mais simplement la méthode avec cet objet Attirbute en particulier. Je souhaite l'utiliser pour mettre des contraintes supplémentaires sur la méthode (type de retour, paramètre, nom, autre attribut-usage, ...).

[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

}


1 commentaires

Bonne question, j'aimerais connaître la réponse aussi ...


3 Réponses :


0
votes

Pour savoir si une méthode comporte un attribut qui lui est appliqué, vous avez déjà la méthodeInfo. xxx


1 commentaires

Ouais, mais comment le faites-vous de l'intérieur de l'attribut? Existe-t-il un moyen de savoir quelle méthode (ou membre) l'instance actuelle de l'attribut est appliquée?



2
votes

Si j'ai bien compris votre question, vous souhaitez obtenir, à l'intérieur du code d'attribut , l'objet (une méthode dans ce cas) à laquelle l'attribut est appliqué.
Je suis à peu près sûr qu'il n'y a pas de mauvaise façon de le faire - l'attribut n'a aucune connaissance de l'objet à laquelle elle est jointe, cette association est l'inverse.

Le mieux que je puisse vous suggérer que vous êtes une solution de contournement comme suit: xxx

note
Que voulez-vous réaliser en accédant à la méthodeInfo à l'intérieur du constructeur de l'attribut? Peut-être qu'il y a une autre façon d'obtenir votre objectif ...

Modifier

comme une autre solution possible, vous pouvez fournir une méthode statique dans votre attribut qui fait la vérification - mais cela implique itération sur la méthodeInfos. xxx


2 commentaires

Comme je l'ai déjà dit, je souhaite mettre des contraintes addiol dessus (type de retour, nombre de paramètres, types de paramètres, nom de la méthode, ...). Si la méthode n'est pas valide, une exception pourrait être lancée. Mais quelle que soit la raison, ne serait-ce pas logique que vous pouvez accéder à la chose où l'attribut est lié?


Oui, mais que voulez-vous faire avec ces contraintes? L'attribut ne sera instancié que lorsque vous essayez de refléter le type, en tout cas.



2
votes

Je pense que la réponse est non. Ou du moins pas de manière raisonnable. L'instance de l'attribut n'est construite que lorsque vous recherchez l'attribut à travers la méthodeInfo. Instancitation de la classe qui a la méthode qui a l'attribut n'instégrera pas l'attribut. Les instances d'attributs ne sont créées qu'une fois que vous commencez à se moquer de les trouver par réflexion.


0 commentaires