3

假设我有一个具有两个字符串类型属性的类

  1. 道具1
  2. 道具2

并且有以下限制

  1. 如果 Prop2 值为“Test2”,则 Prop1 不能等于“Test1”
  2. 如果 Prop1 值为“Test11”,则 Prop2 不能等于“Test22”
  3. 如果 Prop2="Test222" 则设置 Prop1="Test111"

定义其值相互依赖的属性的最佳方法是什么,并且在一个属性中所做的更改应该触发另一个属性的 setter ?

4

4 回答 4

5

您需要在属性设置器中添加验证。

   string prop1;
   string prop2;

   string Prop1 
   {
      get { return prop1;}
      set 
      {
         if (!( Prop2 == "Test2" && value == "Test1"))
         {
             Prop1 = value;
          }
         ... Add other condition here
      }
   }

   string Prop2
   {
      get { return prop1;}
      set 
      {
         // set Prop2 based on Prop1
       }
   }
于 2013-01-02T14:47:02.953 回答
3

您在这里有很多选择:

  • 将这两个属性设为只读,并添加一个同时设置它们的方法。
  • 将这两个属性设为可读写,让它们在设置不一致时抛出异常,并添加一个同时设置它们的方法。
  • 将这两个属性都设为可读写,并添加一个可让您暂时关闭验证的方法。制作一个“守卫”,在销毁时重新打开验证,并在using声明中使用守卫。
  • 为您的对象添加事务语义:注意环境事务,当事务“进行中”时将待处理集存储在队列中,并在事务提交时立即应用所有更改。
于 2013-01-02T14:51:30.040 回答
0

您负责在属性设置器中编写您可能需要的“逻辑”(一种验证)

我会使用规范模式来提取验证逻辑并使其也可测试

http://devlicio.us/blogs/jeff_perrin/archive/2006/12/13/the-specification-pattern.aspx

于 2013-01-02T14:46:14.233 回答
0

您可以在每个属性的设置器中实现此逻辑,但我会质疑这样做的智慧。

最好是Validate在对象上有一个方法来检查这些属性的状态,或者让另一个对象负责执行验证并返回错误或根据需要对对象进行更改。

于 2013-01-02T14:47:27.420 回答