2010-06-10 38 views
1

目前,我試圖確定我的程序集中的哪些「控制器」類具有使用Reflection和LINQ與它們關聯的[Authorize]屬性。使用LINQ和反射:如何在我的程序集中查詢[Authorize]屬性中的所有類?

const bool allInherited = true; 
var myAssembly = System.Reflection.Assembly.GetExecutingAssembly(); 
var controllerList = from type in myAssembly.GetTypes() 
        where type.Name.Contains("Controller") 
        where !type.IsAbstract 
        let attribs = type.GetCustomAttributes(allInherited) 
        where attribs.Contains("Authorize") 
        select type; 
controllerList.ToList(); 

此代碼幾乎可行。

如果我逐步跟蹤LINQ語句,我可以看到當我「懸停」我在LINQ語句中定義的「attribs」範圍變量填充了單個Attribute並且該屬性碰巧屬於AuthorizeAttribute類型。它看起來有點像這樣:

[-] attribs | {object[1]} 
    [+] [0] | {System.Web.Mvc.AuthorizeAttribute} 

顯然,這條線在我的LINQ說法是錯誤的:

where attribs.Contains("Authorize") 

,我應該怎麼寫那裏,而不是檢測是否「attribs」包含AuthorizeAttribute類型或不?

回答

3

你會想這樣做

attribs.Any(a => a.GetType().Equals(typeof(AuthorizeAttribute)) 

你比較字符串這樣的檢查總是失敗的對象,這應該工作。

+0

Riiiight。 「任何」方法。我知道「Contains」是錯誤的(因爲Intellisense不允許我寫Lambda表達式,但我無法弄清楚從列表中選擇哪種方法...) - 謝謝,夥計。我知道這是一個簡單的問題,有人可以立即指出。 – Pretzel 2010-06-10 17:04:39

+0

@Pretzel沒問題 – luke 2010-06-10 17:08:39

0

我認爲實現這個更好的方法是:

var controllerList = (from type in Assembly.GetExecutingAssembly().GetTypes() 
         where !type.IsAbstract 
         where type.IsSubclassOf(typeof(Controller)) || type.IsSubclassOf(typeof(System.Web.Http.ApiController)) 
         where type.IsDefined(typeof(AuthorizeAttribute), allInherited) 
         select type).ToList(); 

或者在它,如果你正在尋找有任何屬性「授權」:

var controllerList = from type in myAssembly.GetTypes() 
        where type.Name.Contains("Controller") 
        where !type.IsAbstract 
        let attrs = type.GetCustomAttributes(allInherited).OfType<Attribute>() 
        where attrs.Any(a => a.Name.Contains("Authorize")) 
        select type; 
相關問題