[英]Create instance of generic class from type
我有一個帶有返回對象的方法的類:
public class Deserializer<T>
{
public static T FromJson(string json)
{
return new JavaScriptSerializer().Deserialize<T>(json);
}
}
我有一個Type。 如何基於此類型創建Deserializer類的實例? 以下顯然不起作用:
var type = typeOf(MyObject);
var foo = Deserializer<type>.FromJson(json);
您也可以為在編譯時不知道類型的使用者提供非通用版本(順便說一句,當您公開API時,這是一種好習慣):
public class Deserializer
{
public static T FromJson<T>(string json)
{
return new JavaScriptSerializer().Deserialize<T>(json);
}
public static object FromJson(string json, Type type)
{
return new JavaScriptSerializer().Deserialize(json, type);
}
}
現在,在編譯時知道類型的使用者:
Foo foo = Deserializer.FromJson<Foo>(json);
以及在編譯時不知道類型的使用者:
Type type = ...
object instance = Deserializer.FromJson(json, type);
這是您可以做到的方式,但是它並不是最佳選擇,除非您絕對必須這樣做。 如果可以,請選擇其他答案之一!
dynamic result = typeof(Deserializer<>).MakeGenericType(type)
.InvokeMember("FromJson", BindingFlags.Public | BindingFlags.Static |
BindingFlags.InvokeMethod, null, null,
new [] { json });
你做不到 泛型類型參數是靜態綁定的(編譯時)。 您不能將其傳遞給System.Type
對象。
對於您的簡單示例,您可以(一定程度上)僅使用MyObject
:
MyObject foo = Deserializer<MyObject>.FromJson(json);
如果可以這樣做,那么FromJson
的結果類型將是什么? 您將如何使用該對象?
Type t = ___; // How do you get this?
??? foo = Deserializer<t>.FromJson(json); // What datatype is foo?
您要嘗試執行的操作不是C#等靜態類型語言的功能。 它更像是一種動態語言功能,例如Python,您只需返回所需的內容並對其執行任何操作即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.