如何定义彼此依赖的属性

时间:2013-01-02 14:43:33

标签: c# .net validation properties dependencies

假设我有一个类,其中包含两个类型为string

的属性
  1. Prop1
  2. Prop2
  3. 还有以下限制

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

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

4 个答案:

答案 0 :(得分: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
       }
   }

答案 1 :(得分:3)

你有很多选择:

  • 将两个属性设置为只读,并添加一个同时设置它们的方法。
  • 将两个属性设置为读写,让它们在未设置一致时抛出异常,并添加一个同时设置它们的方法。
  • 使两个属性都为读写,并添加一个允许您暂时关闭验证的方法。制作一个“防护”,在销毁时重新开启验证,并在using声明中使用防护。
  • 向对象添加事务语义:注意环境事务,在事务处于“进行中”时将待处理的集存储在队列中,并在事务提交时立即应用所有更改。

答案 2 :(得分:0)

您负责编写属性设置器中需要的“逻辑”(验证类型)

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

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

答案 3 :(得分:0)

你可以在每个属性的setter中实现这个逻辑,但我会质疑它的智慧。

在对象上使用Validate方法检查这些属性的状态或让另一个对象负责执行验证并返回错误或对对象进行适当更改可能会更好