首页 / C# / c# – 使用带参数的委托
c# – 使用带参数的委托
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用带参数的委托,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2542字,纯文字阅读大概需要4分钟。
内容图文
我有一个’KeyEvent’课;其中一个成员是:
public delegate void eventmethod(object[] args);
传递给构造函数中对象的方法存储在这个成员中:
private eventmethod em;
构造函数:
public KeyEvent(eventmethod D) {
em = D;
}
public KeyEvent(eventmethod D, object[] args) : this(D) {
this.args = args;
}
public KeyEvent(Keys[] keys, eventmethod D, object[] args) : this(keys, D) {
this.args = args;
}
然后使用公共方法“ThrowEvent”调用’eventmethod’方法:
public void ThrowEvent() {
if (!repeat && thrown) return;
em.DynamicInvoke(args);
this.thrown = true;
}
据我所知,这编译得很好.但是在尝试创建这个类的实例(KeyEvent)时,我做错了什么.这是我到目前为止:
object[] args = {new Vector2(0.0f, -200.0f)};
Keys[] keys = { Keys.W };
KeyEvent KeyEvent_W = new KeyEvent(keys, new KeyEvent.eventmethod(GameBase.ChangeSquareSpeed), args);
GameBase.ChangeSquareSpeed目前没有做任何事情,但看起来像这样:
static public void ChangeSquareSpeed(Vector2 squarespeed) {
}
无论如何,错误的是这一行:
KeyEvent KeyEvent_W = new KeyEvent(keys, new KeyEvent.eventmethod(GameBase.ChangeSquareSpeed), args);
编译器给我的错误是:
error CS0123: No overload for ‘ChangeSquareSpeed’ matches delegate ‘BLBGameBase.KeyEvent.eventmethod’
我的问题是:这是否意味着我必须更改ChangeSquareSpeed以不采用任何参数(在这种情况下,这样做的更好的方法是什么?),或者我在做什么语法错误?
先感谢您.
解决方法:
我认为错误是非常明确的.您的ChangeSquareSpeed方法与委托不匹配.委托需要一个方法,其中一个object []作为参数,但是您传递的方法使用Vector2作为参数,因此出错.
试试这个方法:
static public void ChangeSquareSpeed(object[] squarespeed)
{}
(更新)
我在你的代码中看到了一些混乱,特别是在行中:
object[] args = {new Vector2(0.0f, -200.0f)};
如果你想要一个Vector2数组或者只是一个Vector2的对象,我真的无法理解.
如果你假装有一个Vector2数组,我认为这似乎是合理的:
将委托更改为:
public delegate void eventmethod(Vector2 args);
然后
public void ThrowEvent() {
if (!repeat && thrown) return;
foreach(object obj : args)
{
em.DynamicInvoke((Vector2)obj);
}
this.thrown = true;
}
(更新2)
在这种情况下,我认为你应该创建一个通用版本的KeyEvent.看到这个例子并从那里开始:
class KeyEvent<T>
{
public T Args { get; set; }
public Action<T> A { get; set; }
public KeyEvent() { }
public void ThrowEvent()
{
A.DynamicInvoke(Args);
}
}
// ...
static void M1(object[] o)
{
Console.WriteLine("M1 {0}", o);
}
static void M2(Vector2 v)
{
Console.WriteLine("M2 {0}", v);
}
static void Main(string[] args)
{
KeyEvent<object[]> e1 = new KeyEvent<object[]>
{
A = new Action<object[]>(M1),
Args = new object[] {};
};
KeyEvent<Vector2> e2 = new KeyEvent<Vector2>
{
A = new Action<Vector2>(M2),
Args = new Vector2();
};
}
内容总结
以上是互联网集市为您收集整理的c# – 使用带参数的委托全部内容,希望文章能够帮你解决c# – 使用带参数的委托所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。