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

ale*_*emb 9 c# generics types generic-type-argument

我基本上有这样的事情:

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

Foo(typeof(Person));
Run Code Online (Sandbox Code Playgroud)

Deserialize<ty>不起作用,因为它期望Deserialize<Person>.我该如何解决这个问题?

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

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

编辑:序列化程序是一个JavascriptSerializer并在此处实现为动作过滤器.它被称为:

[JsonFilter(Param="test", JsonDataType=typeof(Person))]
Run Code Online (Sandbox Code Playgroud)

根据Marc和Anton的答案:

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

Mar*_*ell 7

那个序列化器是什么?如果您只知道Type运行时(不是编译时),并且它没有非泛型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);
}
Run Code Online (Sandbox Code Playgroud)


Ant*_*lev 6

如果ty在编译时已知,为什么不呢

void Foo<T>()
{
    var result = serializer.Deserialize<T>(inputContext);
}
Run Code Online (Sandbox Code Playgroud)

除此以外,

MethodInfo genericDeserializeMethod = serializer.GetType().GetMethod("Deserialize");
MethodInfo closedDeserializeMethod = genericDeserializeMethod.MakeGenericMethod(ty);
closedDeserializeMethod.Invoke(serializer, new object[] { inputContext });
Run Code Online (Sandbox Code Playgroud)