从带有参数的事件中调用无参数动作

zix99

我正在尝试编写一种方便的方法,旨在帮助将泛型委托绑定到类事件。

关键在于,类上的事件接受1个或多个参数(例如,对象和各种参数),并且我希望包装的动作接受0个参数。

一个简单的例子是:

public class Test
{
    //Other class.  <int,bool> is just an example, it could be anything
    public event Action<int, bool> MyEvent;

    //Helper
    public void AddAction(Action a, object cls, string eventName)
    {
        var evt = cls.GetType().GetEvent(eventName);

        //Need some code in here to wrap the action
        evt.AddEventHandler(cls, a);
    }
}

显然,上面的代码在我们尝试运行它时可能会引发异常。

编辑:我应该详细说明。我知道我可以做(a,b) => a(),但是在这种情况下,我不知道活动的类型。

我想要的是能够生成一个新的委托,该委托接受intbool然后在内部调用该动作。

我试过编写DynamicMethod / ILGenerator,但运气不佳,因此我正在寻找有关输入方法和建议。据我所知,IL生成是唯一的方法。

提前致谢。

zix99

我花了很多时间来弄清楚这一点,最终绕回了Linq Expressions。

我花了一段时间才意识到,DynamicMethod的主要问题是它没有范围。构建它时,可以将其视为一组静态指令,因此,它不知道“ this”是什么(除非您将其作为参数传递)。

我最终要做的是用期望的参数编译表达式,并在委托上调用期望的方法。

这是一些示例代码:

public static class AnonymousAction
{
    public static Delegate WrapDelegate(Action action, Type targetType)
    {
        var invoke = targetType.GetMethod ("Invoke");
        if (invoke == null)
            throw new ArgumentException ("ofType must be delegate");

        var parameters = invoke.GetParameters ();
        var expressionParams = new ParameterExpression[parameters.Length];
        for (int i=0; i<parameters.Length; ++i)
        {
            expressionParams [i] = Expression.Parameter (parameters [i].ParameterType);
        }

        var call = Expression.Call (
            Expression.Constant(action),
            typeof(Action).GetMethod ("Invoke")
            );

        return Expression.Lambda (targetType, call, expressionParams).Compile ();
    }
}

public class MyReceiver
{
    public event Action<MyReceiver, int> OnAction;

    public void Do()
    {
        OnAction (this, 22);
    }
}

public class Test
{
    public void Run()
    {
        Action onAction = () => {
            Console.WriteLine ("Did something");
        };

        var receiver = new MyReceiver ();
        var evt = receiver.GetType ().GetEvent ("OnAction");
        evt.AddEventHandler (receiver, AnonymousAction.WrapDelegate (onAction, evt.EventHandlerType));

        receiver.Do ();
    }
}
static void Main()
{
    var t = new Test ();
    t.Run ();
}

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从参数调用方法(带有任何参数)

来自分类Dev

调用带有参数的方法

来自分类Dev

带有参数的调用函数

来自分类Dev

MVC中的“读取动作”支架“没有为此对象定义无参数构造函数。”

来自分类Dev

从带有参数的指令中调用ng-repeat的函数

来自分类Dev

调用带有额外参数的forEach中的函数

来自分类Dev

jQuery-在.on()方法中带有参数的调用函数

来自分类Dev

如何在Blazor中调用带有参数的函数?

来自分类Dev

从带有参数的控制器中调用servlet

来自分类Dev

在Python中调用带有正确参数的方法列表

来自分类Dev

erb文件Rails中带有参数的调用方法

来自分类Dev

从带有参数的自定义文件中调用函数

来自分类Dev

从带有参数的指令中调用控制器函数

来自分类Dev

调用带有额外参数的forEach中的函数

来自分类Dev

如何在带有参数的函数中调用变量函数?

来自分类Dev

Java 8 中带有可选参数的调用方法

来自分类Dev

如何引发带有参数的事件?

来自分类Dev

如何从具有参数的另一个函数中调用带有参数的函数?

来自分类Dev

在ExpressJS中带有'/'的参数

来自分类Dev

如何从无参数构造函数中调用带有2个参数的构造函数?

来自分类Dev

<ui:include>中的参数化方法调用带有可变数量的方法参数

来自分类Dev

如何接受带有任意数量参数的函数的指针(作为C中的参数)并调用它?

来自分类Dev

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

来自分类Dev

如何调用带有函数参数的函数?

来自分类Dev

如何调用带有参数的方法?

来自分类Dev

Haxe生成带有参数的超级调用

来自分类Dev

带有隐式参数的调用方法

来自分类Dev

带有参数的递归XSL模板调用

来自分类Dev

带有参数的javascript匿名函数调用

Related 相关文章

  1. 1

    从参数调用方法(带有任何参数)

  2. 2

    调用带有参数的方法

  3. 3

    带有参数的调用函数

  4. 4

    MVC中的“读取动作”支架“没有为此对象定义无参数构造函数。”

  5. 5

    从带有参数的指令中调用ng-repeat的函数

  6. 6

    调用带有额外参数的forEach中的函数

  7. 7

    jQuery-在.on()方法中带有参数的调用函数

  8. 8

    如何在Blazor中调用带有参数的函数?

  9. 9

    从带有参数的控制器中调用servlet

  10. 10

    在Python中调用带有正确参数的方法列表

  11. 11

    erb文件Rails中带有参数的调用方法

  12. 12

    从带有参数的自定义文件中调用函数

  13. 13

    从带有参数的指令中调用控制器函数

  14. 14

    调用带有额外参数的forEach中的函数

  15. 15

    如何在带有参数的函数中调用变量函数?

  16. 16

    Java 8 中带有可选参数的调用方法

  17. 17

    如何引发带有参数的事件?

  18. 18

    如何从具有参数的另一个函数中调用带有参数的函数?

  19. 19

    在ExpressJS中带有'/'的参数

  20. 20

    如何从无参数构造函数中调用带有2个参数的构造函数?

  21. 21

    <ui:include>中的参数化方法调用带有可变数量的方法参数

  22. 22

    如何接受带有任意数量参数的函数的指针(作为C中的参数)并调用它?

  23. 23

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

  24. 24

    如何调用带有函数参数的函数?

  25. 25

    如何调用带有参数的方法?

  26. 26

    Haxe生成带有参数的超级调用

  27. 27

    带有隐式参数的调用方法

  28. 28

    带有参数的递归XSL模板调用

  29. 29

    带有参数的javascript匿名函数调用

热门标签

归档