我有一个JSON反序列化器(如下所示),当我用一种已知的类型调用它时它可以正常工作。
public static T Deserialize<T>(this object obj)
{
var javaScriptSerializer = new JavaScriptSerializer();
return (obj != null) ?
javaScriptSerializer.Deserialize<T>(obj.ToString()) :
default(T);
}
所以这个电话会有效:
var newExampleTypeX = exampleJsonString.Deserialize<ExampleTypeX>();
但是,我要做的是传入一个在运行时设置的类型,并使用它代替“ExampleTypeX”。当我这样做时,我得到以下编译错误:
Cannot resolve symbol 'someType'
所以someType的声明看起来像这样(这是一个简化版本):
var someType = typeof(ExampleTypeX);
var newExampleTypeX = message.Deserialize<someType>();
我应该以某种方式改变我的Deserialize扩展方法,还是改变我传递运行时类型的方式?如果是,那我该如何实现呢。
答案 0 :(得分:2)
与泛型一起使用的类型必须知道编译时。这就是你不能这样做的原因:
var someType = typeof(ExampleTypeX);
var newExampleTypeX = message.Deserialize<someType>();
它与JavaScriptSerializer无关 - 这就是泛型的工作方式。
如果你真的需要,你可以使用反射来绕过它,但我认为你不应该这样做。
您可以在这两个问题中阅读有关使用泛型类型和扩展方法的反射的更多信息: