限制類和類屬性
回答
您遇到的困難是您試圖使用連詞(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
ORSomethingElse
或Whatever
。
由於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
類型的對象要麼是一個Something
或SomethingElse
或Whatever
,但他們只能在任何特定時間的事情之一。
我真的很喜歡這種方法:D – rexdefuror
有沒有辦法內置到C#來做到這一點。你所描述的是通過discriminated unions in F#處理的,但是C#沒有這樣的類型。儘管如此,你可以編寫自己的聯合課來提供這種行爲。
謝謝,我會研究它。 – rexdefuror
可以實現像這樣一類
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");
你也可以在構造函數中做到這一點。
- 1. 限制屬性類型
- 2. 限制屬性類型與元類
- 3. XSD.exe限制基類型屬性
- 4. 限制子類中的訪問屬性
- 5. 屬性和類
- 6. 限制自定義屬性的屬性類型
- 7. 將屬性限制爲類或屬性可行嗎?
- 8. 類和屬性的屬性
- 9. 是否可以將自定義屬性的屬性用法限制爲僅限某類型/超類型的類?
- 10. Python類屬性和子類
- 11. XSD屬性與類型和屬性與限制有什麼區別?
- 12. 訪問類庫中的方法和屬性,但有限制
- 13. xsd:複雜類型與兒童,屬性和限制
- 14. 帶屬性和限制的XSD自定義類型
- 15. 將限制和屬性添加到複雜類型
- 16. XSD屬性限制和值
- 17. xsd限制和屬性
- 18. XMLHttpRequest和類屬性
- 19. 類屬性和__setattr__
- 20. O.O.P和類屬性
- 21. 類和屬性VB.NET
- 22. Perl6類屬性中的類型強制
- 23. 強制類屬性的子類
- 24. 類:屬性屬性
- 25. C++基類和派生類的限制
- 26. 類型參數和上類型限制
- 27. GHC-api和類型檢查類限制
- 28. XSD屬性限制
- 29. C#屬性限制
- 30. 類型屬性類
您可以編寫自己的自定義驗證器並使用IValidateableObject接口 –
這聽起來不錯,您如何看待自定義屬性進行驗證?可以很好地工作以及... – rexdefuror