Create generic Func from reflection

后端 未结 2 1229
南旧
南旧 2021-02-10 00:21

I\'ve specified type in a variable: Type hiddenType. I need to create a Func delegate where T is of type specified in mentioned v

相关标签:
2条回答
  • 2021-02-10 00:59

    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.

    0 讨论(0)
  • 2021-02-10 01:17

    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));
    
    0 讨论(0)
提交回复
热议问题