我想從類型變量中獲取類型。例如:從類型變量中獲取實際類型
Type t = typeof(String);
var result = SomeGenericMethod<t>();
發生在第二行的錯誤,因爲t
不是type
,它是一個變量。任何方式使它成爲一種類型?
我想從類型變量中獲取類型。例如:從類型變量中獲取實際類型
Type t = typeof(String);
var result = SomeGenericMethod<t>();
發生在第二行的錯誤,因爲t
不是type
,它是一個變量。任何方式使它成爲一種類型?
要根據類型的通用的實例,你可以使用反射來獲取通用與您要使用的類型的實例,然後使用激活創建一個實例:
Type t = typeof (string); //the type within our generic
//the type of the generic, without type arguments
Type listType = typeof (List<>);
//the type of the generic with the type arguments added
Type generictype = listType.MakeGenericType(t);
//creates an instance of the generic with the type arguments.
var x = Activator.CreateInstance(generictype);
請注意,x
這裏將是一個object
。要調用它的功能,例如.Sort()
,您必須將其設置爲dynamic
。
請注意該代碼很難讀,寫,維護,推理,理解或愛。如果您有任何替代品需要使用這種結構,探索那些徹底。
編輯:您還可以投射您從Activator
收到的對象,如(IList)Activator.CreateInstance(genericType)
。這將給你一些功能,而不必訴諸於動態。
醜陋的解決方法使用反射:
類與泛型方法
public class Dummy {
public string WhatEver<T>() {
return "Hello";
}
}
使用
var d = new Dummy();
Type t = typeof(string);
var result = typeof(Dummy).GetMethod("WhatEver").MakeGenericMethod(t).Invoke(d, null);
在類的實例看最大的解決方案
爲什麼你不能'SomeGenericMethod()',如果這不是你的用例,那麼你需要提供如何實際使用它,因爲解決它的最好方法取決於你如何做。假設'var'將是't'的類型,那麼你真正想要的是't result = ...',這是一個完全不同的問題。 –
@ScottChamberlain,看起來像一個例子......爲了舉例。青色,請說明是否是。 – Mafii
我得到的類型作爲方法中的參數,然後我想將它傳遞給泛型方法。是的,這只是一個例子。 – Cyan