使用不同参数调用方法

时间:2014-06-25 13:42:49

标签: c# action

我试图用不同的参数调用几个方法。例如,我有一个UIElement,我想移动和删除。在我的课程中,我实现了这些方法:

    public void Move(params object[] args)
    {
        Point lastpoint = (Point)Convert.ChangeType(args[0], typeof(Point));
        Point newpoint = (Point)Convert.ChangeType(args[1], typeof(Point));

        double left = Canvas.GetLeft(this) + (newpoint.X - lastpoint.X);
        double top = Canvas.GetTop(this) + (newpoint.Y - lastpoint.Y);

        Canvas.SetLeft(this, left);
        Canvas.SetTop(this, top);
    }

    public void Remove(params object[] args)
    {
        Canvas parent = this.Parent as Canvas;
        parent.Children.Remove(this);
    }

其中:

    移动中的
  • args由两点组成
  • 删除中的args应为null

我使用一个类来收集来自不同来源(Mouse,Touch,LeapMotion ......)的所有事件,称为EventLinker。这很简单,因为它只包含一个枚举:

public enum GestureKey
{
    OnClick, 
    OnDoubleClick, 
    OnLongClick,
    OnRightClick, 
    OnDoubleRightClick,
    OnLongRightClick,
    OnMove
};

我可以在字典中使用:

private Dictionary<GestureKey, Action<object[]>> MyDictionary;

“移动”和“移除”方法与两种不同的手势相关联:

MyDictionary.Add(GestureKey.OnRightClick, Remove);
MyDictionary.Add(GestureKey.OnMove, Move);

这个想法是在连接到同一个UIElement的几个监听器中使用这个字典,以便能够使用Mouse,TouchScreen,LeapMotion ......来控制我的应用程序。举个例子,当我在我的鼠标监听器中检测到一次点击时,我在字典中调用了OnClick方法:

if (MyDictionary.ContainsKey(GestureKey.OnClick))
{
    object[] args = { _lastPoint };
    Application.Current.Dispatcher.BeginInvoke(MyDictionary[GestureKey.OnClick], args);
}

如果我的所有方法都包含相同的参数编号和类型,这应该不是问题,但是这里我有转换问题,但这个解决方案不是很干净,我确信有办法做到这一点我想要。

即使他们有不同的原型,我也想以相同的方式调用我的方法。如果有人知道该怎么做,请告诉我!

编辑:我认为问题是我用来将我的方法与我的枚举链接起来的字典。它必须包含具有相同原型的方法。在没有相同的原型问题的情况下,我可以使用哪些类可以做同样的事情吗?

EDIT2: 理想情况下,我应该

    public void Move(Point lastpoint, Point newpoint)
    {
        double left = Canvas.GetLeft(this) + (newpoint.X - lastpoint.X);
        double top = Canvas.GetTop(this) + (newpoint.Y - lastpoint.Y);

        Canvas.SetLeft(this, left);
        Canvas.SetTop(this, top);
    }

    public void Remove()
    {
        Canvas parent = this.Parent as Canvas;
        parent.Children.Remove(this);
    }

我认为问题是我用来将我的方法链接到GestureKey的字典(见上文)。

private Dictionary<GestureKey, Action<object[]>> MyDictionary;

字典类允许我将枚举与任何类型链接,这里是一个Action。我必须指定我的Action采用哪些参数,这对我来说是一个动态值。我想我应该这样做:

private Dictionary<GestureKey, Action<TYPELIST>> MyDictionary;

但我不知道怎么做。我试图使用List,但我有同样的问题,它要求我提供静态的东西。 TYPELIST应该动态通知。而且我不知道Dictionary类是否适合它,也许有更好的类。

1 个答案:

答案 0 :(得分:1)

这里的标记略有不同但你会理解它。以下内容对我有用:

    Dictionary<string, Delegate> _callbacks = new Dictionary<string, Delegate>();
    public MainWindow()
    {
        InitializeComponent();

        _callbacks.Add("move", new Action<Point, Point>(Move));
        _callbacks.Add("remove", new Action(Remove));

        Application.Current.Dispatcher.BeginInvoke(_callbacks["move"], new Point(5, 6), new Point(1, 3));
        Application.Current.Dispatcher.BeginInvoke(_callbacks["remove"]);
    }

    public void Move(Point something1, Point something2)
    {
    }

    public void Remove()
    {
    }