C# 如何定义相互依赖的特性

C# 如何定义相互依赖的特性,c#,.net,validation,properties,dependencies,C#,.net,Validation,Properties,Dependencies,假设我有一个具有两个string类型属性的类 建议1 建议2 还有以下限制 如果Prop2值为“Test2”,则Prop1不能等于“Test1” 如果Prop1值为“Test11”,则Prop2不能等于“Test22” 如果Prop2=“Test222”,则设置Prop1=“Test111” 定义其值相互依赖的属性以及在一个属性中所做的更改应触发另一个属性的setter属性的最佳方法是什么?您负责在属性setter中编码可能需要的“逻辑”(某种验证) 我将使用规范模式来提取验证逻辑,并使其可测试

假设我有一个具有两个string类型属性的类

  • 建议1
  • 建议2
  • 还有以下限制

  • 如果Prop2值为“Test2”,则Prop1不能等于“Test1”
  • 如果Prop1值为“Test11”,则Prop2不能等于“Test22”
  • 如果Prop2=“Test222”,则设置Prop1=“Test111”

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

    您负责在属性setter中编码可能需要的“逻辑”(某种验证)

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


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

       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
           }
       }
    

    您可以在每个属性的setters中实现此逻辑,但我怀疑这是否明智


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

    您在这里有很多选择:

    • 将这两个属性设置为只读,并添加同时设置它们的方法
    • 使这两个属性都读写,当它们的设置不一致时,允许它们引发异常,并添加一个同时设置它们的方法
    • 将这两个属性都设置为读写,并添加一个允许您临时关闭验证的方法。制作一个“防护装置”,在销毁时重新打开验证,并在
      using
      语句中使用该防护装置
    • 向对象添加事务语义:注意环境事务,在事务“进行中”时将挂起的集合存储在队列中,并在提交事务时立即应用所有更改

    我想这应该会得到
    家庭作业
    标签-如果它还存在的话@Paul>我认为你需要一些“如果”,然后抛出异常(或者什么也不做),以防试图设置“Test1”或“Test22”。@Laoujin家庭作业标签已被删除。我认为你错过了练习的要点:问题是你可以在无法进行个别更改时使对象处于状态,只有同时更改这两个属性才能起作用。@dasblinkenlight,如果状态和转换的数量很大,在我看来,状态设计模式是最好的选择。如果状态/转换较少,则可以使用较少的设置器进行设置。如果有一些操作仅在初始化期间有效,我将使用标志来区分新的/初始化的状态。不管是什么情况,if/else梯形图都是不可读且容易出错的。我实际上在寻找一种机制,在这种机制中,我可以指定依赖于特定属性(例如s1)值的属性(例如,d1、d2、d3),并且每当s1的值更改时,会自动调用d1、d2、d3的setter。