2016-12-30 4 views
0

У меня есть A, где находится MyCustomAttribute.Получить пользовательские атрибуты по сборкам

Теперь я Ассамблея B, где я reference к сборке A и я использую в сборке BMyCustomAttribute.

Теперь я хочу, чтобы получить все inctanses из MyCustomAttribute в Assebmly В.

Я пытаюсь что-то вроде:

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(); 
} 

и другими способами - но я не могу получить MyCustomAttribute.

UPDATE

Мой атрибут

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

ли вы подтвердить, что 'GetCallingAssembly()' 'фактически возвращает b'? –

+0

Да. Но внутри я не вижу свой собственный атрибут –

+0

Не могли бы вы показать свой атрибут, а также тип, который его реализует? – Bauss

ответ

1

Я попытался это:

public class MyCustomAttribute : Attribute 
{ 
} 

[MyCustom] 
public class SomeClassWithAttribute 
{ 

} 

Затем в консоли:

var assembly = typeof(SomeClassWithAttribute).Assembly; 

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

Я получаю SomeClassWithAttribute в списке типов. @ C.Evenhuis правильно, вы, вероятно, получаете неправильную сборку в методе GetCallingAssembly. Его всегда более надежный способ получить сборку, получив тип, который, как вы знаете, присутствует в этой сборке, а затем получает свойство Assembly от этого.

+0

Attribyte и метод, в котором я использую этот атрибут в разных сборках. –

+0

Вам нужен другой способ получения целевой сборки ... метод, который находит этот атрибут для типов, всегда просматриваемых в конкретной сборке или ее общем методе? Если его общий, всегда ли он должен возвращать атрибут, который он должен найти в сборке вызывающего кода? –

0

Попробуйте это:

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(); 
} 
Смежные вопросы