2013-10-31 2 views
2

클래스를 제한하는 방법은 하나의 속성 만 값을 보유 할 수 있고 나머지는 null이어야합니다. 아니면 내가 설정되어있을 때 다른 모든 null을 할당하여 처리해야합니까?클래스 및 클래스 속성 제한하기

더 이상 접근 할 수있는 방법이 있습니까?

+1

사용자 정의 유효성 검사기를 작성하고 IValidateableObject 인터페이스를 사용할 수 있습니다. –

+0

유효성 검증을 위해 사용자 정의 속성에 대해 어떻게 생각하십니까? 멋지게 잘 작동 할 수 있습니다 ... – rexdefuror

답변

1

당신이 가지고있는 어려움은 (OR)를 나타 내기 위해 연결 (AND)을 사용하려고한다는 것입니다.

당신은 당신은 푸이라고 말을하는지

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

} 

같은 속성의 무리와 함께 수업이있을 때 :

SomethingSomethingElseWhatever.

는하지만, 당신이 정말 말하고 싶은 것은 푸는 것입니다 :

Something또는SomethingElse또는Whatever.

답변에 언급 된대로 은 F #과 같은 ML 언어는 차별화 된 공용체를 사용하여이 아이디어를 표현하는 간결한 방법을 가지고 있습니다. 그러나 더 큰 개념은 sum type의 개념입니다. 이것은 유형 시스템에서 분리 (disjunction) 개념 (즉 논리적 인 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하지만, 그들은 단지 주어진 시간에 그런 것들 중 하나가 될 수 있습니다.

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

또한 생성자에서 수행 할 수도 있습니다.