C# 强制类注册事件

C# 强制类注册事件,c#,interface,C#,Interface,是否可以强制类注册事件?我想用一个事件验证我的属性,如果属性无效,将触发该事件。在类的构造函数中,我希望得到一个IValid接口,它强制所有类实现该接口(如果它们想要使用我的类)。因此,我的属性的验证是安全的,不会得到无效值。还是有更好的机会 关于您可以使您的类型不可变,并在构造时进行验证 比如: public class MyClass { public MyClass(string aString, int anInt) { // Check for validity

是否可以强制类注册事件?我想用一个事件验证我的属性,如果属性无效,将触发该事件。在类的构造函数中,我希望得到一个IValid接口,它强制所有类实现该接口(如果它们想要使用我的类)。因此,我的属性的验证是安全的,不会得到无效值。还是有更好的机会


关于

您可以使您的类型不可变,并在构造时进行验证

比如:

public class MyClass
{
   public MyClass(string aString, int anInt)
   {
     // Check for validity - throw exception if not valid

      ValidString = aString;
      ValidInt = anInt;
   }

   public string ValidString { get; private set; }
   public int ValidInt { get; private set; }
}

这可确保您的实体/类永远不会进入无效状态。

如果需要,您可以在构造函数中接受事件处理程序:

public class Foo
{
    public event Action<string> Bar;
    public Foo(Action<string> initialHandler)
    {
        Bar += initialHandler;
    }
}
公共类Foo
{
公共活动行动栏;
公共Foo(操作初始处理程序)
{
Bar+=初始处理器;
}
}

现在,从技术上讲,有人可以为
initialHandler
传入
null
,所以您需要检查一下,但希望它有助于向此类用户清楚地表明,在使用该类型之前需要提供事件处理程序。

事件最好用于订阅者数量从零到零的情况。如果一个对象的构造需要它有地方发送通知,那么构造函数要么接收一个实现通知接口的对象,要么接收一个将执行适当通知操作的委托。如果使用委托,则不应将其添加到事件列表中,而应将其存储在自己的字段中。检查接口或委托是否正常是值得的,以确保其不为null,但在大多数情况下,除此之外,没有理由产生妄想症