user2160375
user2160375

Reputation:

Create generic Func from reflection

I've specified type in a variable: Type hiddenType. I need to create a Func<T> delegate where T is of type specified in mentioned variable and assign an method:

var funcType = typeof(Func<>).MakeGenericType(hiddenType);
Func<object> funcImplementation = () => GetInstance(hiddenType);

var myFunc= Delegate.CreateDelegate(funcType , valueGenerator.Method);

It doesn't works - because funcImplementation is returns object instead of desired. At runtime, it will surely be an instance of type specified in hiddenType.

GetInstance returns object and signaure cannot be changed.

Upvotes: 5

Views: 2769

Answers (2)

LInsoDeTeh
LInsoDeTeh

Reputation: 1038

Instead of using a Type, you could consider using a generic wrapper, if it's not possible for you to change the GetInstance signature:

private Func<THidden> GetTypedInstance<THidden>()
{
    return () => (THidden)GetInstance(typeof(THidden));
}

Then you can just call it with

GetTypedInstance<SomeClass>();

instead of

GetInstance(typeof(SomeClass));

Upvotes: 0

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726987

You can solve this by building an expression tree manually, and inserting a cast to hiddenType. This is allowed when you construct an expression tree.

var typeConst = Expression.Constant(hiddenType);
MethodInfo getInst = ... // <<== Use reflection here to get GetInstance info
var callGetInst = Expression.Call(getInst, typeConst);
var cast = Expression.Convert(callGetInst, hiddenType);
var del = Expression.Lambda(cast).Compile();

Note: the above code assumes that GetInstance is static. If it is not static, change the way you construct callGetInst to pass the object on which the method is invoked.

Upvotes: 5

Related Questions