[英]C# Get a list of all runtime constructed classes of a generic class
我試圖列出由通用類創建的所有運行時構造類。 換句話說,如果我有課:
public GenericCls<T> {
public void Reset() { ... }
...
}
我在這樣的不同地方都有代碼:
GenericCls<int> gci = new GenericCls<int>();
GenericCls<String> gcs = new GenericCls<String>();
GenericCls<float> gcf = new GenericCls<float>();
...
我可以得到這樣的東西嗎:
Type[] allconstructed = GetAllConstructed(typeof(GenericCls<>));
返回{GenericCls<int>,GenericCls<String>,GenericCls<float>,...}
該用例涉及一個通用分配器,該分配器支持任何類型的對象分配(就像new XXX()
,但是比垃圾收集器更好)。 我不會詳細說明,因為這只會使問題復雜化。 基本上,在編譯時我不會知道所有構造的類,因為該庫是旨在與單獨的代碼項目一起使用的dll。 因此,我將需要某種形式的反射,這些反射似乎是在互連網上找不到的。
Assembly.GetExecutingAssembly().GetExportedTypes()
除了基本的通用類(即typeof(GenericCls<>)
)之外,不包含任何內容。
typeof(GenericCls<>).GetGenericArguments()
僅返回類型“ T”,它不僅是無效類型,而且完全無用。
如果僅知道通用類的類型,是否甚至可以找到通用類的所有構造類? ( typeof(GenericCls<>);
)我不確定“ constructed”是否是正確的詞-我想知道當前活動的所有具體泛型派生類,還是所有將存在的類(不確定如何C#在后台處理通用構造)。
@DavidMårtensson:您的回答給了我一個主意。 我可以在任何非泛型類中列出類型的靜態列表,並在構造時注冊每個構造的類(當已知T時)。 即
static public class ConcreteList {
static public List<Type> concrete;
}
public class GenericCls<T> {
static GenericCls() {
ConcreteList.concrete.Add(typeof(GenericCls<T>));
}
}
我用ConcreteList.concrete[x].GetGenericArguments()
,它正在工作。 哦,快點
您可以使用工廠類來創建實例,這樣工廠類可以保留所有已創建類的列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.