I basically have something like this:
void Foo(Type ty)
{
var result = serializer.Deserialize<ty>(inputContent);
}
Foo(typeof(Person));
The Deserialize<ty>
doesn't work because it expects Deserialize<Person>
instead. How do I work around this?
I'd also like to understand how generics work and why it won't accept ty
which is typeof(Person)
.
EDIT: I ought to have mentioned that this is a contrived example. I cannot actually change the signature of the function because it implements an interface.
EDIT: serializer is a JavascriptSerializer and implemented as an action filter here. It is called thusly:
[JsonFilter(Param="test", JsonDataType=typeof(Person))]
Based on Marc and Anton's answers:
var result = typeof(JavaScriptSerializer).GetMethod("Deserialize")
.MakeGenericMethod(JsonDataType)
.Invoke(serializer, new object[] { inputContent });
Which serializer is that? If you only know the Type
at runtime (not compile time), and it doesn't have a non-generic API, then you might have to use 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);
}
If ty
is known at compile-time, why don't just
void Foo<T>()
{
var result = serializer.Deserialize<T>(inputContext);
}
Otherwise,
MethodInfo genericDeserializeMethod = serializer.GetType().GetMethod("Deserialize");
MethodInfo closedDeserializeMethod = genericDeserializeMethod.MakeGenericMethod(ty);
closedDeserializeMethod.Invoke(serializer, new object[] { inputContext });
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With