Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to turn a Type instance into a generic type argument

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))]

Solution

Based on Marc and Anton's answers:

var result = typeof(JavaScriptSerializer).GetMethod("Deserialize")
                 .MakeGenericMethod(JsonDataType)
                 .Invoke(serializer, new object[] { inputContent });
like image 640
aleemb Avatar asked May 13 '09 08:05

aleemb


2 Answers

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);
}
like image 72
Marc Gravell Avatar answered Oct 13 '22 22:10

Marc Gravell


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 });
like image 21
Anton Gogolev Avatar answered Oct 13 '22 21:10

Anton Gogolev