Comment vérifier si la méthode a un attribut
J'ai un exemple de classe
public class MyClass{
ActionResult Method1(){
....
}
[Authorize]
ActionResult Method2(){
....
}
[Authorize]
ActionResult Method3(int value){
....
}
}
Maintenant ce que je veux, c'est d'écrire une fonction qui renvoie true/false qui peut être exécuté comme ce
var controller = new MyClass();
Assert.IsFalse(MethodHasAuthorizeAttribute(controller.Method1));
Assert.IsTrue(MethodHasAuthorizeAttribute(controller.Method2));
Assert.IsTrue(MethodHasAuthorizeAttribute(controller.Method3));
Je suis arrivé au point où
public bool MethodHasAuthorizeAttribute(Func<int, ActionResult> function)
{
return function.Method.GetCustomAttributes(typeof(AuthorizeAttribute), false).Length > 0;
}
serait travailler pour Method3. Maintenant, comment puis-je le faire générique en sorte que ça va prendre des chaînes et des classes en tant que paramètres ainsi ?
- Voulez-vous vérifier si oui ou non la classe, une méthode ou une propriété possède ces attributs à l'intérieur d'une méthode générique?
- Est-ce que vous voulez simplement savoir si une méthode a un certain type de l'attribut appliqué sur elle?
- Je veux vérifier si la méthode a un ensemble d'attributs mais je ne veux pas passer un nom de méthode comme une chaîne de caractères.
Vous devez vous connecter pour publier un commentaire.
De la question avec votre code est la signature de
public bool MethodHasAuthorizeAttribute(Func<int, ActionResult> function)
.MethodHasAuthorizeAttribute
ne peut être utilisé avec des arguments correspondant à la signature du délégué que vous avez spécifié. Dans ce cas, une méthode retournant unActionResult
avec un paramètre de typeint
.Lorsque vous appelez cette méthode comme
MethodHasAuthorizeAttribute(controller.Method3)
, le Compilateur fera une méthode de conversion de groupe. Cela pourrait ne pas être toujours désiré, et qui peut produire des résultats inattendus (Méthode du groupe de conversions ne sont pas toujours straigthforward). Si vous essayez d'appelerMethodHasAuthorizeAttribute(controller.Method1)
, vous obtiendrez une erreur de compilation, car il n'y a pas de conversion.Plus générale de la solution peut être construit avec des arbres d'expression et de la célèbre "MethodOf" truc. Il emploie généré par le compilateur, des arbres d'expression pour trouver l'invocation de la cible:
Vous pouvez l'utiliser comme ça, mais il peut également être utilisé avec n'importe quelle méthode:
Avec cela de la manière, nous pouvons construire un général de mise en œuvre:
D'accord, c'est pour les méthodes. Maintenant, si vous voulez appliquer l'Attribut vérifier sur les classes ou les champs (je vais vous épargner les propriétés, car ils sont en fait des méthodes), nous devons effectuer nos vérifier sur
MemberInfo
, qui est l'héritage de la racine pourType
,FieldInfo
etMethodInfo
. Ce aussi facile que l'extraction de l'Attribut de recherche dans une méthode distincte et en fournissant des méthodes de l'adaptateur avec de jolis noms:Je vais laisser la mise en œuvre pour les champs comme un exercice, vous pouvez utiliser la même astuce que MethodOf.
Il y a une solution plus facile, veuillez vous adresser par rapport aux autres ci-dessus avec le courant .NET/C# version (4.6.1, C#6):
Si vous avez seulement une une méthode de même nom:
Maintenant de vérifier si vous avez l'attribut défini sur la méthode:
Et si vous voulez accéder aux propriétés de l'attribut, vous pouvez le faire c'est très simple:
S'il y a plusieurs méthodes avec le même nom, vous pouvez aller sur et utiliser
method.GetParameters()
et vérifier les paramètres, au lieu de.GetMethods().Single...
Si vous savez que votre méthode n'a pas de paramètres, cette vérification est facile:
Si non, cela va être plus compliqué (vérification des paramètres, etc.) et les autres solutions sont de manière plus simple et robuste à l'usage.
Donc: Utilisez cette option si vous n'avez pas de surcharges pour une méthode, ou voulez seulement lire les attributs à partir d'une méthode avec un certain nombre de paramètres.
Sinon, utilisez la
MethodOf
fournis par d'autres réponses ici.- Je faire quelque chose comme ça:
Appel il suit
Trouver des exemples où je peux trouver des méthodes dans une classe qui ont un attribut spécifié appliquée.
Le paramètre qui est passé est une instance d'une classe. Vous pouvez modifier le code pour l'adapter à vos besoins, ce qui devrait être assez facile.