2

有没有办法限制一个类,所以只有 1 个属性可以保存值,而其余属性必须为空。还是我只需要在设置任何时将所有其他人分配为 null 来处理它?

有没有更可行的方法来解决这个问题?

4

3 回答 3

4

C# 没有内置的方法来执行此操作。您所描述的内容是通过F# 中的可区分联合处理的,但 C# 没有这种类型。不过,您可以编写自己的联合类来提供这种行为。

于 2013-10-31T00:35:16.483 回答
1

您遇到的困难是您试图使用连词 ( AND) 来表达析取 ( OR)。

当您有一个具有一堆属性的类时

class Foo
{
    public Something        Property1 { get; set; }
    public SomethingElse    Property2 { get; set; }
    public Whatever         Property3 { get; set; }

}

你说 Foo 是:

Something SomethingElse Whatever

但是,你真正想说的是 Foo 是:

Something SomethingElse Whatever

正如David Arno在他的回答中提到的那样,像 F# 这样的 ML 语言有一种使用可区分联合来表达这个想法的紧凑方式。但是,更大的概念是sum 类型,这是在类型系统中表达析取(即逻辑OR)概念的方式。C# 也可以轻松地表示 sum 类型,尽管比 F# 键入更多(没有双关语)。

public class Foo
{
    public Bar Property { get; set; }
}

public abstract class Bar
{
    public class Something : Bar
    {

    }

    public class SomethingElse : Bar
    {

    }

    public class Whatever: Bar
    {

    }
}

现在我们有了您想要的:类型Foo的对象要么是 aSomething 要么 SomethingElse 要么 Whatever,但它们在任何给定时间只能是其中之一。

于 2013-10-31T03:48:39.243 回答
0

你可以像这样在一个类上实现它

public class OneProp
{
  private string val1;
  public string Value1 { get { return val1; } };

  private string val2;
  public string Value2 { get { return val2; } };

  public void SetValue(string propName, string propValue)
  {
   // null all values here
   val1 = null;
   val2 = null;

    switch(propName)
    {
      case "Value1":
      val1 = propValue;
      break;

      case "Value2":
      val1 = propValue;
      break;
    }
  }
}

然后创建它的一个实例;

OneProp val = new OneProp();
val.SetValue("name", "value");

您也可以在构造函数中执行此操作。

于 2013-10-31T03:57:38.957 回答