2010-02-07 15 views
5

J'ai quelque chose comme interface marqueur ceci:Y at-il un moyen plus rapide/meilleure façon d'obtenir des méthodes qui ont l'attribut appliqué en C#

[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)] 
public class MyAttribute : Attribute 
{ 
} 

Et je veux l'appliquer à des méthodes sur différentes classes dans les différentes assemblées.

Ensuite, je veux obtenir un MethodInfo pour toutes les méthodes qui ont cet attribut appliqué. J'ai besoin de rechercher l'ensemble AppDomain et obtenir une référence à toutes ces méthodes.

Je sais que nous pouvons obtenir tous les types et ensuite obtenir toutes les méthodes, mais y at-il un moyen plus rapide/mieux de le faire? ... ou est-ce le moyen le plus rapide d'obtenir les informations dont j'ai besoin?

(je suis en utilisant ASP.NET MVC 1.0, C#, 3,5 ./NET)

tas Merci!

Répondre

14

En fin de compte, non - vous devez les scanner. LINQ le rend cependant sans douleur.

 var qry = from asm in AppDomain.CurrentDomain.GetAssemblies() 
        from type in asm.GetTypes() 
        from method in type.GetMethods() 
        where Attribute.IsDefined(method, typeof(MyAttribute)) 
        select method; 

Notez ce que des scans chargé ensembles "tout comme".

+0

Merci pour que Marc! Et pour la requête Linq ... et l'avertissement ... Aide moi et d'autres aussi, je suis sûr. J'utilise ASP.NET MVC ... j'ai fait tester re: le chargement de classe dans ASP.NET parce que j'ai trouvé que certains de mes tests unitaires ne chargeaient pas d'assemblages externes à moins qu'un type ne soit référencé ... ASP.NET semble charger tout dans l'AppDomain heureusement ... Merci encore. – jwwishart

0

Je l'ai aussi cherché il y a quelques semaines. Je pense qu'il n'y a pas de moyen plus facile.
Vous pourriez être en mesure de spiffy un peu avec LINQ.

+0

C'était ce que je pensais aussi! Merci – jwwishart

2

Une chose que vous devez prendre en compte est un attribut supplémentaire que vous pouvez appliquer à une classe/struct, indiquant que zéro ou plusieurs méthodes de ce type sont marquées. Cela devrait vous donner au moins un ordre d'amélioration de la performance.

Si l'attribut est défini par l'utilisateur (non intégré au framework .NET), alors lorsque vous énumérez les assemblys pour obtenir les types, vous devez ignorer les assemblys de structure tels que mscorlib et System.

+0

Merci pour les conseils de perf! Je voterais si je pouvais ... – jwwishart

2

Si vous avez vraiment besoin du gain de performance, faites Marc suggested puis mettez en cache les résultats dans un fichier. La prochaine fois que l'application est chargée, si le fichier mis en cache existe, elle peut charger la méthode appropriée sans analyser tous les assemblages.

Voici un exemple d'un fichier de cache possible:

<attributeCache> 

    <assembly name='Assembly1' filename='Assembly1.dll' timestamp='02/02/2010'> 
    <type name='Assembly1.Type1'> 
     <method name='Method1'/> 
    </type> 
    </assembly> 

<assembly name='Assembly2' filename='Assembly2.dll' timestamp='02/02/2010' /> 
</attributeCache>