我的这个类有一个返回对象的方法:
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);
答案 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,你只需返回你想要的任何东西,并做任何你想做的事情。