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)
那个序列化器是什么?如果您只知道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)
如果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)