2016-12-30 1 views
0

J'ai l'assemblage A, où se trouve MyCustomAttribute.Récupérer des attributs personnalisés sur des assemblages

Maintenant je Assemblée B, où je reference à l'assemblage A et je l'utilise dans l'assemblage BMyCustomAttribute.

Maintenant, je veux obtenir tous inctanses de MyCustomAttribute dans Assebmly B.

J'essaie quelque chose comme:

public static void Registration() 
{ 
    List<MyCustomAttribute> atrr = new List<MyCustomAttribute>(); 

    var assembly = System.Reflection.Assembly.GetCallingAssembly(); 

    var types = (from type in assembly.GetTypes() 
        where Attribute.IsDefined(type, typeof(MyCustomAttribute)) 
        select type).ToList(); 
} 

Et d'autres moyens - mais je ne peux pas obtenir MyCustomAttribute.

MISE À JOUR

Mon attribut

namespace NamespaceOne.Attributes 
{ 
    [AttributeUsageAttribute(AttributeTargets.Method, AllowMultiple = false, 
    Inherited = false)] 
    public class MyCustomAttribute: Attribute 
    { 
     ...... 
    } 
} 

Now the second Assembly(second project - ASP WebApi): 

namespace SecondNamespace.Controllers 
{ 
    public class HomeController : Controller 
    { 

     [MyCustomAttribute] 
     public ActionResult Index() 
     { 
     MyStaticMethod.Registration(); // THIS Class andmethod in First class library - where located attribute 
      ViewBag.Title = "Home Page"; 

      return View(); 
     } 
+2

Avez-vous vérifié que 'GetCallingAssembly()' retourne effectivement 'B'? –

+0

Oui. Mais à l'intérieur je ne vois pas mon attribut personnalisé –

+0

Pourriez-vous montrer votre attribut, ainsi que le type qui l'implémente? – Bauss

Répondre

1

J'ai essayé ceci:

public class MyCustomAttribute : Attribute 
{ 
} 

[MyCustom] 
public class SomeClassWithAttribute 
{ 

} 

Puis dans la console:

var assembly = typeof(SomeClassWithAttribute).Assembly; 

      var types = (from type in assembly.GetTypes() 
         where Attribute.IsDefined(type, typeof(MyCustomAttribute)) 
         select type).ToList(); 

Je reçois SomeClassWithAttribute dans la liste des types. @ C.Evenhuis est correct, vous obtenez probablement le mauvais assemblage dans la méthode "GetCallingAssembly". Il est toujours plus fiable d'obtenir un assembly en obtenant un type que vous connaissez est présent dans cet assembly et en obtenant la propriété Assembly à partir de cela.

+0

Attribyte et méthode où j'utilise cet attribut dans différents assemblages –

+0

Vous avez besoin d'un autre moyen d'obtenir l'assembly cible ... est la méthode qui trouve cet attribut sur les types recherchant toujours dans un assembly spécifique ou sa méthode générique? Si c'est générique, est-il toujours supposé retourner l'attribut qu'il est censé trouver dans l'assemblage du code appelant? –

0

Essayez ceci:

public static void Registration() 
{ 
    List<RegistryAttribute> atrr = new List<RegistryAttribute>(); 

    var assembly = System.Reflection.Assembly.GetCallingAssembly(); 

    var types = assembly.GetTypes().Where(type => 
        type.GetCustomAttributes().Any(x => x is typeof(MyCustomAttribute))).ToList(); 
}