使用反射来调用方法

尼基尔古德

在使用 Azure ServiceFabric 时,我们使用StateManager.GetStateAsync方法来获取值,同样的方法可用于获取类等对象类型中的值。

我正在尝试使用以下代码

var typeObj = Activator.CreateInstance(type);
var method = typeof(IActorStateManager).GetMethod(nameof(IActorStateManager.GetStateAsync));
            var generic = method.MakeGenericMethod(type);
            dynamic task = generic.Invoke(typeObj, new[] { stateName })
            object result = await task;

通过这种方法,我得到了例外。

Data: {System.Collections.ListDictionaryInternal}
    HResult: -2146232829
    HelpLink: null
    InnerException: null
    Message: "Object does not match target type."
    Source: "mscorlib"
    StackTrace: "at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)
                at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)  
                at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)   
                at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)"
    TargetSite: {Void CheckConsistency(System.Object)}
特尔

很可能,这里有一些事情被混淆了。如果您的代码就是您实际执行的代码,那么您就过度/滥用了该type变量。

让我们决定这type是一个具体的ActorStateManager. 然后

var typeObj = Activator.CreateInstance(type); // typeobj is now ActorStateManager

错误可能在这里:

var generic = method.MakeGenericMethod(type); 
// generic is now StateManager.GetStateAsync<ActorStateManager>

你的意图不是创造StateManager.GetStateAsync<ActorStateManager>,而是StateManager.GetStateAsync<bool>StateManager.GetStateAsync<DateTime>

此外,我 GetStateAsync将(可选?)取消令牌作为第二个参数,在进行反射时最好是明确的。

所以这就是你想要做的我猜:

    public async Task<object> TryLotsOfTypesAndIgnoreErrors(string stateName)
    {
        var typeObj = Activator.CreateInstance(typeof(ActorStateManager));
        foreach (var typeParam in new[] {typeof(bool), typeof(string)})
        {
            try
            {
                var method = typeof(IActorStateManager).GetMethod(nameof(IActorStateManager.GetStateAsync));
                var generic = method.MakeGenericMethod(typeParam);
                var task = (Task) generic.Invoke(typeObj, new object[] { stateName, CancellationToken.None });
                await task;
                return task.GetType().GetProperty(nameof(Task<object>.Result))?.GetValue(task);
            }
            catch
            {
                // TODO: Catch only exception specific to type mismatch
            }
        }
        return null;
    }

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用反射来调用公共方法

来自分类Dev

如何使用反射来调用与原始参数的方法?

来自分类Dev

如何使用反射来动态调用类型?

来自分类Dev

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

来自分类Dev

为什么我可以使用反射来调用外部类的私有方法?

来自分类Dev

使用HashMap和反射来调用具有可变参数类型的方法

来自分类Dev

使用反射来动态调用函数会产生错误:非静态方法需要目标

来自分类Dev

为什么我可以使用反射来调用外部类的私有方法?

来自分类Dev

如何在Java类的公共成员中使用反射来调用方法?

来自分类Dev

使用反射来测试内部私有类的方法

来自分类Dev

如何将通过反射获得的方法分配给委托?(或者:如何通过反射来加快方法调用的速度)

来自分类Dev

使用反射来修改对象的结构

来自分类Dev

使用反射来修改对象的结构

来自分类Dev

使用反射调用静态方法

来自分类Dev

使用反射来调用带有nil参数的函数会导致“使用零值参数调用”恐慌

来自分类Dev

在Scala中,对案例类classtag使用反射来查找伴随对象的apply方法

来自分类Dev

通过Kotlin的反射来调用类的构造函数

来自分类Dev

使用Control + Plus快捷键创建MenuItem –使用反射来修改MenuItem的私有字段是最好的方法吗?

来自分类Dev

使用反射调用方法并返回值

来自分类Dev

如何使用反射调用需要数组的方法

来自分类Dev

使用反射调用方法并返回值

来自分类Dev

使用反射调用Type参数化方法

来自分类Dev

使用反射调用Integer.parseInt方法

来自分类Dev

如何使用反射调用需要数组的方法

来自分类Dev

使用反射从Main调用通用方法

来自分类Dev

如何使用反射来获取/设置属性的值?

来自分类Dev

C#使用反射来捕获异常抛出

来自分类Dev

使用反射来识别给定装饰器的属性

来自分类Dev

在Go中使用反射来获取结构的名称

Related 相关文章

  1. 1

    使用反射来调用公共方法

  2. 2

    如何使用反射来调用与原始参数的方法?

  3. 3

    如何使用反射来动态调用类型?

  4. 4

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

  5. 5

    为什么我可以使用反射来调用外部类的私有方法?

  6. 6

    使用HashMap和反射来调用具有可变参数类型的方法

  7. 7

    使用反射来动态调用函数会产生错误:非静态方法需要目标

  8. 8

    为什么我可以使用反射来调用外部类的私有方法?

  9. 9

    如何在Java类的公共成员中使用反射来调用方法?

  10. 10

    使用反射来测试内部私有类的方法

  11. 11

    如何将通过反射获得的方法分配给委托?(或者:如何通过反射来加快方法调用的速度)

  12. 12

    使用反射来修改对象的结构

  13. 13

    使用反射来修改对象的结构

  14. 14

    使用反射调用静态方法

  15. 15

    使用反射来调用带有nil参数的函数会导致“使用零值参数调用”恐慌

  16. 16

    在Scala中,对案例类classtag使用反射来查找伴随对象的apply方法

  17. 17

    通过Kotlin的反射来调用类的构造函数

  18. 18

    使用Control + Plus快捷键创建MenuItem –使用反射来修改MenuItem的私有字段是最好的方法吗?

  19. 19

    使用反射调用方法并返回值

  20. 20

    如何使用反射调用需要数组的方法

  21. 21

    使用反射调用方法并返回值

  22. 22

    使用反射调用Type参数化方法

  23. 23

    使用反射调用Integer.parseInt方法

  24. 24

    如何使用反射调用需要数组的方法

  25. 25

    使用反射从Main调用通用方法

  26. 26

    如何使用反射来获取/设置属性的值?

  27. 27

    C#使用反射来捕获异常抛出

  28. 28

    使用反射来识别给定装饰器的属性

  29. 29

    在Go中使用反射来获取结构的名称

热门标签

归档