2013-10-31 84 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"); 

你也可以在構造函數中做到這一點。