我不确定如何谷歌这个,所以这可能是一个愚蠢的问题,但无论如何我都会问它。
我有一个希望代理返回字符串的事件。
public delegate string IncomingMessageHook(SpecialClasses.IncomingMessageData msg);
public event IncomingMessageHook InComingMessage;
当多个委托方法挂钩到事件时,如何阻止一个方法覆盖另一个方法的输出? 我只想要返回字符串的方法的输出,而不是NULL值。 有没有办法实现这一点,或者这是不可能的? 谢谢!
修改 一个示例情况是这样的:
public string NewMessage(string[] _message, System.Net.IPEndPoint RemoteIP)
{
if (InComingMessage != null)
{
string toreturn = InComingMessage(new SpecialClasses.IncomingMessageData(_message, RemoteIP));
return toreturn;
}
else return null;
}
//this calls the event and retrieves a string from it, then returns that.
static string Return_Null(OnyLib.SpecialClasses.IncomingMessageData msg)
{
return null;
}
//This hooked method returns null.
static string Return_Something(OnyLib.SpecialClasses.IncomingMessageData msg)
{
return "Something!";
}
//this hooked method returns "Something!"
使用上面的代码,我如何确保如果我调用NewMessage()它将返回“Something!”而不是NULL?
答案 0 :(得分:1)
这对于从事件处理程序返回除void之外的任何内容毫无意义,正是由于您的问题突出显示的原因。你应该重新设计你的模型。委托应返回void,并且应该有一些其他机制来处理因处理消息而产生的字符串。也许只是一个提升事件的类的方法。
答案 1 :(得分:1)
不对您的设计作出判断。有可能实现这一目标。 您需要将订阅者迭代到InComingMessage事件,并检查每个委托的调用的返回值。以下代码演示了这一点。
public delegate string IncomingMessageHook(int id);
public event IncomingMessageHook InComingMessage;
private string OnInComingMessage(int id)
{
IncomingMessageHook handler = null;
Delegate[] targets = null;
string result;
handler = InComingMessage;
if (handler != null)
{
targets = handler.GetInvocationList();
foreach (Delegate target in targets)
{
try
{
handler = (IncomingMessageHook)target;
result = handler.Invoke(id);
if (!String.IsNullOrEmpty(result))
{
break;
}
}
catch (Exception ex)
{
}
}
}
return result;
}