2016-12-30 57 views
0

我有程序集A,其中MyCustomAttribute位於。跨程序集獲取自定義屬性

現在我有大會B,在那裏我有reference組裝A和我在組裝BMyCustomAttribute使用。

現在我想獲得的所有MyCustomAttribute在inctanses B. 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(); 
}