通过带有委托参数的反射调用泛型方法的问题

威廉

我已经花了一个多小时来解决这个问题,但似乎无法正确解决。这是我遇到的例外之一:

错误:类型的对象System.Func1[System.Object]无法转换为type System.Func1[System.Collections.Generic.IEnumerable1[System.Collections.Generic.IEnumerable1[System.Object]]]

基本上我有一个通用的工厂方法,看起来像这样

ReturnItem<TResult> CreateOutput<T, TResult>(Func<IEnumerable<T>> postBack,
    Processor manager) where TResult : class;

并且我正在尝试反思,但是这Func<IEnumerable<T>>导致了我的问题。这是我尝试调用的代码:

var infer = Factory.CreateReturnInference(); //Keypair value (type, type) is NOT an NormalOutputFactory in this instance
Func<object> callBack = () => subTypes;

var toRun = Factory.GetType()
            .GetMethod("CreateOutput", BindingFlags.Public | BindingFlags.Instance)
            .MakeGenericMethod(infer.Key, infer.Value)
            .Invoke(Factory,
                new object[] {callBack, Manager}) as
            ReturnItem<object>;

从中返回的密钥对值Factory.CreateReturnInference用于指定通用参数,仅用于提供其实现的清晰性(警告非常丑陋的代码,违反了其他交易标准:)

public KeyValuePair<Type, Type> CreateReturnInference()
    {
        return this is NormalOutputFactory
            ? new KeyValuePair<Type, Type>(typeof (object), typeof (Log))
            : new KeyValuePair<Type, Type>(typeof (IEnumerable<object>), typeof (Enum));
    } 

一般的问题是:通过反射调用泛型方法时,如何指定Func参数?

纳瓦尔

问题是您没有Func<T>正确指定参数。换句话说,您要传递给CreateOutput方法的是错误的类型。当您这样做时:

MakeGenericMethod(infer.Key, infer.Value)

方法的类型参数

ReturnItem<TResult> CreateOutput<T, TResult>(Func<IEnumerable<T>> postBack, ...)

您正在通过aretypeof(IEnumerable<object>)typeof(Enum)因为你做

return new newKeyValuePair<Type, Type>(typeof(IEnumerable<object>), typeof(Enum));

因此,CreateOutput您尝试创建方法具有如下签名:

ReturnItem<Enum> CreateOutput(Func<IEnumerable<IEnumerable<object>>> postBack, ...)

换句话说,T成为IEnumerable<object>TResult成为Enum但是Func您传递来调用构造的泛型方法参数的callback定义如下:

Func<object> callBack = () => subTypes;

您的解决方案是:

1)更改签名callback如下:

Func<IEnumerable<IEnumerable<object>>> callBack = () => subTypes;

2)或通过调整键值对函数来更改通用方法的参数类型。

Func<IEnumerable<object>> callBack = () => subTypes;

public KeyValuePair<Type, Type> CreateReturnInference()
{
    return ... new KeyValuePair<Type, Type>(typeof(object), typeof(Enum));
} 

我认为第二个是您想要的,但是我不确定。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过反射调用具有params参数的泛型方法

来自分类Dev

泛型-调用带有泛型参数的方法

来自分类Dev

通过反射调用带有参数的泛型方法时,无法将类型为System.Int32的对象转换为System.Object []

来自分类Dev

通过反射调用本地泛型方法

来自分类Dev

如何通过反射调用带有枚举(枚举)参数的方法?

来自分类Dev

无法通过反射调用带有varargs参数的方法-NoSuchMethodException

来自分类Dev

将lambda作为参数分配给通过反射调用的泛型方法

来自分类Dev

通过反射通过表达式调用泛型方法

来自分类Dev

通过传递参数调用泛型方法?

来自分类Dev

通过反射C#调用参数中带有参数的方法

来自分类Dev

(反射)在Swift中通过函数名称调用带有参数的方法

来自分类Dev

通过反射访问/执行泛型方法?

来自分类Dev

从catch块的结果调用带有泛型参数的Java方法

来自分类Dev

调用带有参数谷值反射的方法

来自分类Dev

如何通过反射从不同的程序集中使用内部委托参数调用内部方法?

来自分类Dev

通过反射调用具有命名参数的方法

来自分类Dev

通过反射调用具有命名参数的方法

来自分类Dev

通过派生类型使用反射调用泛型基类上的方法

来自分类Dev

从具有泛型参数的子类方法调用构造函数

来自分类Dev

带有泛型类型的函数参数的泛型类方法不适用于Void

来自分类Dev

C#泛型类作为参数,与泛型类的调用方法具有相同的T

来自分类Dev

C#泛型类作为参数,与泛型类的调用方法具有相同的T

来自分类Dev

mockito:通过反射模拟参数的方法调用

来自分类Dev

当使用单个参数调用时,带有可选参数的方法委托不起作用

来自分类Dev

通过反射调用具有Class <T>类型参数的私有方法

来自分类Dev

反射方法调用与委托调用的性能

来自分类Dev

反射方法调用与委托调用的性能

来自分类Dev

当方法的参数为List时如何通过反射调用私有方法?

来自分类Dev

C#-如何使用反射来调用带有可变数量参数的静态方法

Related 相关文章

  1. 1

    通过反射调用具有params参数的泛型方法

  2. 2

    泛型-调用带有泛型参数的方法

  3. 3

    通过反射调用带有参数的泛型方法时,无法将类型为System.Int32的对象转换为System.Object []

  4. 4

    通过反射调用本地泛型方法

  5. 5

    如何通过反射调用带有枚举(枚举)参数的方法?

  6. 6

    无法通过反射调用带有varargs参数的方法-NoSuchMethodException

  7. 7

    将lambda作为参数分配给通过反射调用的泛型方法

  8. 8

    通过反射通过表达式调用泛型方法

  9. 9

    通过传递参数调用泛型方法?

  10. 10

    通过反射C#调用参数中带有参数的方法

  11. 11

    (反射)在Swift中通过函数名称调用带有参数的方法

  12. 12

    通过反射访问/执行泛型方法?

  13. 13

    从catch块的结果调用带有泛型参数的Java方法

  14. 14

    调用带有参数谷值反射的方法

  15. 15

    如何通过反射从不同的程序集中使用内部委托参数调用内部方法?

  16. 16

    通过反射调用具有命名参数的方法

  17. 17

    通过反射调用具有命名参数的方法

  18. 18

    通过派生类型使用反射调用泛型基类上的方法

  19. 19

    从具有泛型参数的子类方法调用构造函数

  20. 20

    带有泛型类型的函数参数的泛型类方法不适用于Void

  21. 21

    C#泛型类作为参数,与泛型类的调用方法具有相同的T

  22. 22

    C#泛型类作为参数,与泛型类的调用方法具有相同的T

  23. 23

    mockito:通过反射模拟参数的方法调用

  24. 24

    当使用单个参数调用时,带有可选参数的方法委托不起作用

  25. 25

    通过反射调用具有Class <T>类型参数的私有方法

  26. 26

    反射方法调用与委托调用的性能

  27. 27

    反射方法调用与委托调用的性能

  28. 28

    当方法的参数为List时如何通过反射调用私有方法?

  29. 29

    C#-如何使用反射来调用带有可变数量参数的静态方法

热门标签

归档