gpt4 book ai didi

c# - 在 C# 中,您可以对事件设置约束吗?

转载 作者:太空狗 更新时间:2023-10-29 19:58:46 24 4
gpt4 key购买 nike

我想根据它们实现的接口(interface)来限制可以订阅特定事件的类型。

即我希望实现 IPerson 的对象“Employee”订阅事件处理程序,但要限制实现完全不同接口(interface)的另一个对象“Truck”。开箱即用的任何实现正确方法模式的对象都可以订阅。

我该如何限制?

我问的原因是我正在实现观察者模式,但尝试使用 C# 事件来实现。我有一个类似于 what MSDN has here 的例子.

但我仍然担心具有任何结构的任何对象(只要它包含适当的委托(delegate)方法)都可以在事件触发时执行。所以在我上面的例子中,员工可以实现对我的例子中的对象有意义的方法,但是任何人都可以创建另一个类 - 在我上面的例子中的“卡车”,具有任何结构(只要它再次实现该方法) 并与主题事件联系起来...这绝对是对对象使用和良好设计的更多关注,也许我在这里很挑剔,但这让我很困扰。

最佳答案

这是一个非常糟糕的主意。请不要这样做。

您真正要防止的是什么?任何“敌对”类型都可以实现该接口(interface)(如果他们看不到该接口(interface),因为它在您的项目内部,那么没有理由不将事件也设置为内部事件),因此您的黑名单并没有得到很好的执行。更糟糕的是,这让白名单上的类型变得更加困难——他们将无法轻松地将监听器委托(delegate)给“关闭”的实例、相关类型。即使使用闭包(通过 lambda/匿名方法)也可能突然中断订阅 - “呈现”订阅对象可能成为(列入黑名单的)编译器生成类的实例。

这是一个糟糕的安全机制,它不提供编译时安全性。它不能很好地将坏人拒之门外,反而让好人的日子不好过。

无论如何,这是可能的 - 您将需要为事件使用自定义实现并验证每个订阅请求。

//Please don't do this.

private EventHandler myEventField = delegate { };

// Add synchronization if required.
public event EventHandler MyEvent
{
add
{
if(value.Target is IPerson)
myEventField += value;

else throw new ArgumentException("Subscriber must implement IPerson", "value");
}

remove { myEventField -= value; }
}


private void RaiseMyEvent() { myEventField(this, EventArgs.Empty); }

关于c# - 在 C# 中,您可以对事件设置约束吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7891666/

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