Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 派生类中属性更改的基类感知_C#_Oop_Inheritance_Data Structures - Fatal编程技术网

C# 派生类中属性更改的基类感知

C# 派生类中属性更改的基类感知,c#,oop,inheritance,data-structures,C#,Oop,Inheritance,Data Structures,我想知道是否有人有可能解决以下问题。。。我有一个基类,一系列派生类将从中继承。基类关心派生类上的属性是否已更改。这是为数据传输对象设置“IsDirty”方法 传统的方法是设置在基类中声明的IsDirty布尔标志。我希望以某种方式避免这种情况,并想知道是否有其他方法?我担心的是,开发人员不记得在派生类的属性上的等效集合操作中设置标志。我曾考虑过创建一个通用的“SetProperty”方法,该方法将采用属性名称和值,但我认为可能还有更优雅的方法 作为旁注,关于使用反射的想法不是问题。不管思考的代价有

我想知道是否有人有可能解决以下问题。。。我有一个基类,一系列派生类将从中继承。基类关心派生类上的属性是否已更改。这是为数据传输对象设置“IsDirty”方法

传统的方法是设置在基类中声明的IsDirty布尔标志。我希望以某种方式避免这种情况,并想知道是否有其他方法?我担心的是,开发人员不记得在派生类的属性上的等效集合操作中设置标志。我曾考虑过创建一个通用的“SetProperty”方法,该方法将采用属性名称和值,但我认为可能还有更优雅的方法


作为旁注,关于使用反射的想法不是问题。不管思考的代价有多大,我想证明一种方法,并在今后的道路上进一步完善它

控制对类(或一组类)的访问的合适模式是代理模式。此模式允许您在代理级别实现一次正确的isDirty行为,并将任何只读行为委托给真实实例

当和工厂模式一起使用以控制实例的创建时,此模式最为有效


此解决方案将屏蔽实例的运行时类型,因此,如果您的设计依赖于运行时类型信息,则您需要单独解决此问题(例如,使用状态模式)或找到替代方法。

是否可以强制派生类实现INotifyPropertyChanged?在这种情况下,我将在基类constructur和chill中向PropertyChanged事件添加一个侦听器。派生类现在仍然需要遵循该模式(这可能是您想要避免的)

关于引发属性更改事件的“未使用文本字符串”方法,这本书读得很好:

(快速&脏)-类似这样的东西怎么样?(您的GetHashCode实现可能会有所不同-我使用ReSharper自动生成此代码)

用这个来测试

var cat = new Cat("BobTheCat", 12);
Console.WriteLine(cat.IsDirty);
cat.Age = 13;
Console.WriteLine(cat.IsDirty);
结果如下:

假的
真的

哇。多么优雅的解决问题的方法啊!我已经看过INotifyPropertyChanged接口,但是我能找到的大多数示例仍然依赖于每个setter都有额外的代码。我已经做好充分准备,不会有一个完整的“魔弹”解决方案,但这样做的好处远远大于缺点。我将尝试一下,并可能将此标记为答案。效果很好!非常感谢。这确实是一种有趣的方法,但我确实需要运行时类型信息(即使用这些对象的“发现服务”)。我不知道为什么我没有考虑国家模式,因为现在看来似乎很明显。这是一个不错的方法,我可以看到它是如何工作的。我对这种方法的唯一问题是,它是一种“要么全有,要么全无”的方法。我在最初的问题中没有具体说明,但有一种明显的可能性,即某些属性可能无法跟踪更改。
var cat = new Cat("BobTheCat", 12);
Console.WriteLine(cat.IsDirty);
cat.Age = 13;
Console.WriteLine(cat.IsDirty);