gpt4 book ai didi

c# - MulticastDelegate 和异常处理 : is it possible to wrap it all generically?

转载 作者:行者123 更新时间:2023-11-30 13:51:40 27 4
gpt4 key购买 nike

调用多播委托(delegate)时,应使用 GetInvocationList 逐一调用委托(delegate):

public void IterateAll()
{
if( _doExecute != null )
{
foreach( ExecuteCallback doSingleExecute in _doExecute.GetInvocationList() )
{
try
{
doSingleExecute();
}
catch
{
// This delegate threw an exception
}
}
}
}

有没有一种方法可以将其通用化,以便通过包装此迭代来返回到单个调用以隐藏它,以便只能再次调用整个多播委托(delegate)?这将更接近有意的水平。

最佳答案

你可以这样做:

public static void CallAllAndCatch(this Action self)
{
if (self == null)
return;

foreach (Action i in self.GetInvocationList()) {
try { i(); }
catch { }
}
}

请注意,如果您发现自己经常使用泛型,则可以使用泛型。 EventHandler<T> , 但您不能对 any 类型的 any 委托(delegate)执行此操作,因为委托(delegate)类型不能在彼此之间分配,即使它们是兼容的,并且在定义时没有机制将特定泛型参数限制为具有特定签名的委托(delegate)的泛型方法。 (我认为具有相同签名的委托(delegate)被认为是从 .NET 4 开始的兼容类型。)

对于 EventHandler<T>方法:

public static void CallAllAndCatch(this EventHandler<T> self, object sender, T args)
where T : EventArgs
{
if (self == null)
return;

foreach (EventHandler<T> i in self.GetInvocationList()) {
try { i(sender, args); }
catch { }
}
}

如果您不介意放弃性能和编译时类型检查,您可以这样做,它适用于任何委托(delegate)类型:

public static void CallAllAndCatch(this Delegate self, params object[] args)
where T : EventArgs
{
if (self == null)
return;

foreach (Delegate i in self.GetInvocationList()) {
try { i.DynamicInvoke(args); }
catch (MemberAccessException) { throw; } // A type of something in args isn't compatible with the delegate signature.
catch (TargetException) { throw; } // The delegate itself is invalid.
catch { } // Catch everything else.
}
}

关于c# - MulticastDelegate 和异常处理 : is it possible to wrap it all generically?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4160031/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com