我找到了很多关于如何对事件(或委托)做出反应的资源。 例如:
Control.ValueChanged += (sender, e) =>
{
//do something
};
但是,我不知道如何创建自己的活动?基本上我有一个课程需要“开火”。一个事件,在创建此对象的类中,您可以对此事件做出反应。
有什么想法吗?
如果我使用Delegate代替它,我该怎么做(创建我自己的可由另一个类实现的Delegate对象)?
谢谢!
答案 0 :(得分:8)
你的意思是这样的吗?
class Foo
{
public event EventHandler MyEvent;
public void DoSomething()
{
// do stuff
// raise the MyEvent event
var handler = MyEvent;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
答案 1 :(得分:1)
我个人使用Action
s。
public abstract class ServiceClient
{
public Action OnNetworkActivityStarted { get; set; }
private void StartNetworkActivity()
{
if (OnNetworkActivityStarted != null)
OnNetworkActivityStarted();
}
}
任何继承类都会/可以使用您在上面提供的逻辑。
public class MyClient : ServiceClient
{
public MyClient()
{
this.OnNetworkActivityStarted += () =>
{
//do whatever the subclass needs to do when the event is fired
};
}
}
我已经在类库中实现了这一点,我计划使用跨平台移动应用程序。这允许每个设备实现自己的策略,让用户知道网络已经启动。
我希望这会有所帮助。
答案 2 :(得分:1)
根据您的需要,您可以做两件事:
您可以创建一个包含委托的变量(变量类型将是所述委托)。当您希望能够在对象外部实现功能时,您通常会这样做。你也可以使用这个东西返回一个值,这样就可以用它来改变对象的状态。
您可以创建活动。当您希望能够阻止对象中发生某些事件时,您可以执行此操作:触发事件。你的对象根本不应该知道之后发生的事情。这通常是您在实现View时所执行的操作,您可以触发一些事件,以便Controller可以了解View中的内容。然后,他可以决定如何处理View after。
第一个例子,名称检索没有在控制器中定义,它必须由外部设置。 Controller不知道它是如何工作的,但它想要检索整数id的名称。它的工作方式与界面相同:
public class MyController {
private NameForIDFetcher NameFetcher { get; set; }
private List<int> _ids = new List<int>();
public delegate string NameForIDFetcher(int id);
public void showNames() {
if (this.NameFetcher == null) {
throw new Exception("No NameFetcher set.");
}
foreach (int id in this._ids) {
Console.WriteLine(id + ": " + this.NameFetcher(id));
}
}
}
第二个例子,视图可以阻止所有可能在事件出现时和事件消失时连接到事件的侦听器。如果没有人连接,视图不应该改变它的行为(如果有人知道它应该的情况,请告诉我)。你可以注意到我第二次使用Action,这是一个返回void的泛型委托,并在参数中获取你给出的模板。你最多可以有16个模板参数,这意味着委托会占用16个参数,但那会是一个非常讨厌的委托吗?
public class MyView {
public event ViewAction onViewAppeared;
public event Action<MyView> onViewDisappeared;
public delegate void ViewAction(MyView view);
public void show() {
// Stuffs
if (this.onViewAppeared != null) {
this.onViewAppeared(this);
}
}
public void hide() {
// Stufs
if (this.onViewDisappeared != null) {
this.onViewDisappeared(this);
}
}
}