2013-10-31 46 views
2

有没有办法限制一个类,所以只有一个属性可以保留值,而其余的则必须为空。或者,我必须通过将所有其他人设置为空来处理它,当设置任何其他人时?限制类和类属性

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

+1

您可以编写自己的自定义验证器并使用IValidateableObject接口 –

+0

这听起来不错,您如何看待自定义属性进行验证?可以很好地工作以及... – rexdefuror

回答

1

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

当你有一个像

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

} 

一束性质的一类你是说foo是:

SomethingSomethingElseWhatever

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

SomethingORSomethingElseWhatever

由于David Arno在他的回答中提到,像F#这样的ML语言有一种使用歧视联合表达这种想法的紧凑方式。但是,更大的概念是在类型系统中表达分离概念(即逻辑OR)的方式。 C#也可以很容易地表达总和类型,虽然比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类型的对象要么是一个SomethingSomethingElseWhatever,但他们只能在任何特定时间的事情之一。

+0

我真的很喜欢这种方法:D – rexdefuror

4

有没有办法内置到C#来做到这一点。你所描述的是通过discriminated unions in F#处理的,但是C#没有这样的类型。尽管如此,你可以编写自己的联合课来提供这种行为。

+0

谢谢,我会研究它。 – rexdefuror

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"); 

你也可以在构造函数中做到这一点。