1

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

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);
4

3 回答 3

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);
于 2012-08-20T21:34:00.840 回答
1

这就是您可以做到的方式,但除非您绝对必须这样做,否则它并不是最佳选择。如果可以,请选择其他答案之一!

dynamic result = typeof(Deserializer<>).MakeGenericType(type)
    .InvokeMember("FromJson", BindingFlags.Public | BindingFlags.Static |
                              BindingFlags.InvokeMethod, null, null,
                  new [] { json });
于 2012-08-20T21:45:24.277 回答
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,您只需返回您想要的任何内容并对其执行任何操作。

于 2012-08-20T21:33:08.760 回答