C# 从类型创建泛型类的实例

C# 从类型创建泛型类的实例,c#,generics,C#,Generics,这个类有一个返回对象的方法: public class Deserializer<T> { public static T FromJson(string json) { return new JavaScriptSerializer().Deserialize<T>(json); } } 公共类反序列化器 { 公共静态T FromJson(字符串json) { 返回新的JavaScriptSerializer().Dese

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

public class Deserializer<T>
{
    public static T FromJson(string json)
    {
        return new JavaScriptSerializer().Deserialize<T>(json);
    }   
}
公共类反序列化器
{
公共静态T FromJson(字符串json)
{
返回新的JavaScriptSerializer().Deserialize(json);
}   
}
我有一种类型。如何基于此类型的实例创建反序列化器类的实例?以下内容显然不起作用:

var type = typeOf(MyObject);
var foo = Deserializer<type>.FromJson(json);
var type=typeOf(MyObject);
var foo=反序列化程序.FromJson(json);

您不能这样做。泛型类型参数是静态绑定的(编译时)。无法向其传递
系统。请键入
对象

对于您的简单示例,您可以(稍微明显地)使用
MyObject

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

您试图做的并不是像C#这样的静态类型语言的特性。它更像是一种动态语言功能,就像Python一样,您只需返回任何您想要的内容,并对其执行任何您想要的操作。

您不能这样做。泛型类型参数是静态绑定的(编译时)。无法向其传递
系统。请键入
对象

对于您的简单示例,您可以(稍微明显地)使用
MyObject

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

您试图做的并不是像C#这样的静态类型语言的特性。它更像是一种动态语言功能,如Python,您只需返回您想要的任何内容并执行您想要的任何操作。

您还可以为编译时不知道类型的用户提供非通用版本(这是公开API时的一种好做法):


您还可以为编译时不知道类型的使用者提供非泛型版本(在公开API时,这是一种很好的做法):


这是你可以做到的,但它不是完全最优的,除非你绝对必须这样做。如果可以的话,选择其他答案之一

dynamic result = typeof(Deserializer<>).MakeGenericType(type)
    .InvokeMember("FromJson", BindingFlags.Public | BindingFlags.Static |
                              BindingFlags.InvokeMethod, null, null,
                  new [] { json });
dynamic result=typeof(反序列化程序)。MakeGenericType(类型)
.InvokeMember(“FromJson”,BindingFlags.Public | BindingFlags.Static|
BindingFlags.InvokeMethod,null,null,
新[]{json});

这是您可以做到的,但除非您绝对必须这样做,否则它不是完全最优的。如果可以的话,选择其他答案之一

dynamic result = typeof(Deserializer<>).MakeGenericType(type)
    .InvokeMember("FromJson", BindingFlags.Public | BindingFlags.Static |
                              BindingFlags.InvokeMethod, null, null,
                  new [] { json });
dynamic result=typeof(反序列化程序)。MakeGenericType(类型)
.InvokeMember(“FromJson”,BindingFlags.Public | BindingFlags.Static|
BindingFlags.InvokeMethod,null,null,
新[]{json});

+1,虽然您需要创建一个实例来调用此方法。我相信它是可行的,但是,蝙蝠侠!这并不是最漂亮的答案:)+1,尽管你需要创建一个实例来调用这个方法。我相信它是可行的,但是,蝙蝠侠!这并不是最漂亮的答案:)它有效,但请记住引用System.Web.Extensions(.NET 4/4.5)的正确版本,其中反序列化方法将类型作为参数:)它有效,但请记住引用System.Web.Extensions(.NET 4/4.5)的正确版本,其中反序列化方法将类型作为参数:)
Type type = ...
object instance = Deserializer.FromJson(json, type);
dynamic result = typeof(Deserializer<>).MakeGenericType(type)
    .InvokeMember("FromJson", BindingFlags.Public | BindingFlags.Static |
                              BindingFlags.InvokeMethod, null, null,
                  new [] { json });