2010-02-04 36 views
4

在驗證的概念的項目我的工作,我有我希望通過一些子類來擴展一個通用的抽象類:註冊一個類別的所有聲明的子類在C#

public abstract class Pet { 
    public abstract string PetTypeName {get;} 
} 

public class Dog : Pet { 
    public override string PetTypeName { get { return "Dog"; } } 
} 

我想有填充了這個類的所有子類型的靜態集合:

public static List<Type> AllPetTypes = new List<Type> { 
    typeof(Dog), 
    typeof(Cat), 
    //... 
}; 

但是,這只是增加了一個步驟,當我們要爲大家介紹一種新的亞型,這是容易出錯,因爲這只是程序員在運行時忘記做的一件事。我怎麼能自動創建這樣的集合,包括我的程序集中繼承給定父類的每個類型?

編輯

對此做什麼,我會用這個問題:

因爲我們使用相同的SaaS產品,但隨着訪問門戶網站的不同子集的多個客戶端的「通道」跟蹤用戶到達特定頁面的方式以及點擊「完成」後應將其發送到何處可能很困難。

因此,我正在爲ASP.NET門戶集思廣益體系結構的可能性,其中每個頁面實際上都是一個增強型用戶控件,它接受一個特定的強類型類來保存其參數,以及跟蹤麪包屑所涉及的所有任務,URL創建等等被抽象到框架中。所以框架需要知道可以像頁面一樣處理的所有控件。理想情況下,在框架中創建新的用戶控件並使其代碼隱藏類擴展某個基類足以將該控件註冊爲系統中的新頁面。

這引出了我的下一個問題:使用這個問題的建議解決方案中提到的技術,在給定程序集中查找類型,在ASP.NET Web項目的上下文中工作,其中類型在代碼隱藏?我不太確定用戶控件在何處編譯,或者它們是否被認爲是Web項目組件的一部分。有沒有人有更多的見解? (我應該使這一新的問題?)

回答

13
var targetAssembly = Assembly.GetExecutingAssembly(); // or whichever 
var subtypes = targetAssembly.GetTypes().Where(t => t.IsSubclassOf(typeof(Pet))); 
0
Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsSubclassOf(typeof(parentClass))) 
3

你可以像這樣的東西開始。這將使您獲得與定義類型派生的定義類型相同的程序集中的所有類型。

class Aware { 
    public static readonly IEnumerable<Type> AllTypes; 
    static Aware() { 
     Type awareType = typeof(Aware); 
     allTypes = Assembly.GetAssembly(awareType) 
          .GetTypes() 
          .Where(t => awareType.IsAssignableFrom(t));   
    } 
} 

測試:

class Foo : Aware { } 
class Bar : Aware { } 

foreach (var type in Aware.AllTypes) { 
      Console.WriteLine(type); 
} 

輸出:

Aware 
Foo 
Bar 

我最好奇,想知道你會用這個東西。

+0

我更新了問題以解釋我將如何使用它。 – StriplingWarrior 2010-02-04 22:58:55