从类型创建泛型类的实例

时间:2012-08-20 21:29:05

标签: c# generics

我的这个类有一个返回对象的方法:

public class Deserializer<T>
{
    public static T FromJson(string json)
    {
        return new JavaScriptSerializer().Deserialize<T>(json);
    }   
}

我有一个类型。如何基于此类型创建Deserializer类的实例?以下显然不起作用:

var type = typeOf(MyObject);
var foo = Deserializer<type>.FromJson(json);

3 个答案:

答案 0 :(得分:8)

您可以为在编译时不知道类型的消费者提供非泛型版本(这是您在公开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);

答案 1 :(得分:1)

这是你可以做到的,但除非你绝对必须这样做,否则它并不是最佳选择。如果可以,请使用其中一个答案!

dynamic result = typeof(Deserializer<>).MakeGenericType(type)
    .InvokeMember("FromJson", BindingFlags.Public | BindingFlags.Static |
                              BindingFlags.InvokeMethod, null, null,
                  new [] { json });

答案 2 :(得分:0)

你不能这样做。通用类型参数是静态绑定的(编译时)。您无法将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,你只需返回你想要的任何东西,并做任何你想做的事情。