1

我有一个 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 扩展方法,还是更改我传入运行时类型的方式?如果是这样,那么我该如何实现。

4

1 回答 1

2

与泛型一起使用的类型必须在编译时知道。这就是为什么你不能这样做:

var someType = typeof(ExampleTypeX);
var newExampleTypeX = message.Deserialize<someType>();

它与 JavaScriptSerializer 无关——这就是泛型的工作方式。

如果你真的需要,你可以使用反射来绕过它,但我认为你不应该这样做。

您可以在这两个问题中阅读有关使用泛型类型和扩展方法的反射的更多信息:

C#中的泛型,使用变量的类型作为参数

反思以识别扩展方法

于 2013-03-08T16:17:20.760 回答