簡體   English   中英

從變量實例化泛型類型

[英]Instantiate generic type from variable

我想實例化一個新對象,其中類型和泛型類型被定義為變量。 最終結果可能類似於在此手動創建的newListOfObject:

var newListOfObjects = new List<TabViewModel>();

TabViewModel是以下對象:

public class TabViewModel
{
    public string Title { get; set; }
    public int TabOrder { get; set; }
}

嘗試僅使用變量實例化新對象時出現問題 我們有一個泛型類型變量genericType,它是一個接口和一個類型參數列表listOfTypeArgs。 在上面的示例中,泛型類型將是IList,參數將是TabViewModel。 然后它看起來像下面( 注意,一些代碼是psudo以便於理解 ):

Type genericType = IList'1;
Type[] listOfTypeArgs = TabViewModel;
var newObject = Activator.CreateInstance(genericType.MakeGenericType(listOfTypeArgs));

很明顯,我得到錯誤'System.MissingMethodException',注意我無法從接口實例化變量。

如何將接口轉換為其代表,以便我可以實例化新對象?

注意:我無法更改Type genericType = IList'1; 也不是Type [] listOfTypeArgs = TabViewModel;

您需要使用List<>類型,如下所示:

var genericType = typeof(List<>);
var boundType = genericType.MakeGenericType(typeof(TabViewModel));
var instance = Activator.CreateInstance(boundType);

該錯誤是自描述的,您需要具體類型來創建實例。 而不是IList (沒有實現,只是一個契約),你需要使用IList的實現:

Type genericType = typeof(List<>);
Type[] listOfTypeArgs = new[] { typeof(TabViewModel) };
var newObject = Activator.CreateInstance(genericType.MakeGenericType(listOfTypeArgs));

編輯:

如果您沒有具體類型,則需要使用容器或反映當前程序集。 下面是一些hack,你需要調整你發現對你的情況有用的方式。

Type genericType = typeof(List<>);
Type concreteType = AppDomain.CurrentDomain.GetAssemblies()
                            .SelectMany(s => s.GetTypes())
                            .Where(p => genericType.IsAssignableFrom(p)).FirstOrDefault();

Type[] listOfTypeArgs = new[] { typeof(TabViewModel) };
var newObject = Activator.CreateInstance(concreteType.MakeGenericType(listOfTypeArgs));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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