c# - 如何将 Type 实例转换为泛型类型参数

标签 c# generics types generic-type-argument

我基本上有这样的东西:

void Foo(Type ty)
{
    var result = serializer.Deserialize<ty>(inputContent);
}

Foo(typeof(Person));

Deserialize<ty>不起作用,因为它需要 Deserialize<Person>反而。我该如何解决这个问题?

我还想了解泛型是如何工作的以及为什么它不接受 ty这是 typeof(Person) .

编辑:我应该提到这是一个人为的例子。我实际上无法更改函数的签名,因为它实现了一个接口(interface)。

编辑:序列化程序是一个 JavascriptSerializer 并在此处作为操作过滤器实现。它的名字是这样的:

[JsonFilter(Param="test", JsonDataType=typeof(Person))]

解决方案

根据 Marc 和 Anton 的回答:

var result = typeof(JavaScriptSerializer).GetMethod("Deserialize")
                 .MakeGenericMethod(JsonDataType)
                 .Invoke(serializer, new object[] { inputContent });

最佳答案

那是哪个序列化器?如果您只知道运行时(不是编译时)的类型,并且它没有非通用 API,那么您可能必须使用 MakeGenericMethod:

void Foo(Type ty)
{
    object result = typeof(ContainingClass).GetMethod("Bar").
        .MakeGenericMethod(ty).Invoke(null, new object[] {inputContent});
}
public static T Bar<T>(SomeType inputContent) {
    return serializer.Deserialize<T>(inputContent);
}

关于c# - 如何将 Type 实例转换为泛型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/856665/

相关文章:

c# - 在不重启应用程序的情况下处理 URL 协议(protocol)

c# - 在构建后事件中使用来自 SVN 的可执行文件

c# - 在 SignalR V 2.0 中支持驼峰式属性名称

c# - 如何只查找同时具有 getter 和 setter 的属性?

c - 使用 %d 打印 char 变量值

c# - 如何解决 - 无法使用 Automapper 将 Generic.List 转换为 Linq.IQueryable?

java - 一个类可以有一个映射属性,其中 Class 对象作为键,作为该类对象列表的值吗?

java - 关于java中泛型转换的一些知识

c - 如何编写处理大数的解决方案?

go - 为什么golang自定义错误变量有多种类型