首页 / C# / C#:将派生类作为一个通用参数传递
C#:将派生类作为一个通用参数传递
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#:将派生类作为一个通用参数传递,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1990字,纯文字阅读大概需要3分钟。
内容图文
![C#:将派生类作为一个通用参数传递](/upload/InfoBanner/zyjiaocheng/759/6b1a33fee6d940d6aa6276dd2259d51e.jpg)
我最近开始学习更多关于事件/代理以及类扩展的知识.
我想通过向Windows Form控件添加一个名为SetDraggable()的扩展方法,将我学到的东西付诸实践,然后使用MouseDown和MouseMove事件来移动控件.
一切正常,除了它只适用于特定控件 – 在我的情况下,一个按钮.
namespace Form_Extensions
{
public static class Extensions
{
private static System.Windows.Forms.Button StubButton;
private static Point MouseDownLocation;
public static void SetDraggable(this System.Windows.Forms.Button b)
{
b.MouseDown += b_MouseDown;
b.MouseMove += b_MouseMove;
StubButton = b;
}
private static void b_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
MouseDownLocation = e.Location;
}
}
static void b_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
StubButton.Left = e.X + StubButton.Left - MouseDownLocation.X;
StubButton.Top = e.Y + StubButton.Top - MouseDownLocation.Y;
}
}
}
}
可以看出,我需要特定的控件才能调用Mouse事件 – 我无法从父类System.Windows.Forms访问这些事件.
所以我的问题仍然存在 – 是否有一个概念允许程序员一般将所有派生类作为参数传递.我基本上试图避免复制粘贴每个控件的下面的代码,并希望为从System.Windows.Forms派生的所有类推广它.
据我所知,这个想法的主要缺陷是我假设所有派生类都有我需要的事件;但是,由于代表形式的功能存在类似的事情,我希望有人可以权衡涉及对象或参数的情况.
解决方法:
父类不是System.Windows.Forms,它只是命名空间.实际的父类是Control,你当然可以使用它:)使用泛型方法也是可能的,但不是真的必要.
理想情况下,您还希望避免使用这些静态字段,因为它可能具有多个并发可拖动字段; SetControlDraggable方法中的闭包将更好地工作:
public static void SetControlDraggable(this Control control)
{
Point mouseDownLocation = Point.Empty;
control.MouseDown += (s, e) =>
{
if (e.Button == MouseButtons.Left) mouseDownLocation = e.Location;
}
control.MouseUp += (s, e) =>
{
if (e.Button == MouseButtons.Left)
{
control.Left = e.X + control.Left - mouseDownLocation.X;
control.Top = e.Y + control.Top - mouseDownLocation.Y;
}
}
}
内容总结
以上是互联网集市为您收集整理的C#:将派生类作为一个通用参数传递全部内容,希望文章能够帮你解决C#:将派生类作为一个通用参数传递所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。