簡體   English   中英

C#獲取泛型類的所有運行時構造的類的列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM