我试图用不同的参数调用几个方法。例如,我有一个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);
}
其中:
我使用一个类来收集来自不同来源(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类是否适合它,也许有更好的类。
答案 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()
{
}