有没有办法限制一个类,所以只有 1 个属性可以保存值,而其余属性必须为空。还是我只需要在设置任何时将所有其他人分配为 null 来处理它?
有没有更可行的方法来解决这个问题?
C# 没有内置的方法来执行此操作。您所描述的内容是通过F# 中的可区分联合处理的,但 C# 没有这种类型。不过,您可以编写自己的联合类来提供这种行为。
您遇到的困难是您试图使用连词 ( 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
,但它们在任何给定时间只能是其中之一。
你可以像这样在一个类上实现它
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");
您也可以在构造函数中执行此操作。