簡體   English   中英

從類型創建泛型類的實例

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

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