클래스를 제한하는 방법은 하나의 속성 만 값을 보유 할 수 있고 나머지는 null이어야합니다. 아니면 내가 설정되어있을 때 다른 모든 null을 할당하여 처리해야합니까?클래스 및 클래스 속성 제한하기
더 이상 접근 할 수있는 방법이 있습니까?
클래스를 제한하는 방법은 하나의 속성 만 값을 보유 할 수 있고 나머지는 null이어야합니다. 아니면 내가 설정되어있을 때 다른 모든 null을 할당하여 처리해야합니까?클래스 및 클래스 속성 제한하기
더 이상 접근 할 수있는 방법이 있습니까?
당신이 가지고있는 어려움은 (OR
)를 나타 내기 위해 연결 (AND
)을 사용하려고한다는 것입니다.
당신은 당신은 푸이라고 말을하는지
class Foo
{
public Something Property1 { get; set; }
public SomethingElse Property2 { get; set; }
public Whatever Property3 { get; set; }
}
같은 속성의 무리와 함께 수업이있을 때 :
Something
및SomethingElse
및Whatever
.
는하지만, 당신이 정말 말하고 싶은 것은 푸는 것입니다 :
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
하지만, 그들은 단지 주어진 시간에 그런 것들 중 하나가 될 수 있습니다.
나는이 접근법을 정말로 좋아한다 : 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");
또한 생성자에서 수행 할 수도 있습니다.
사용자 정의 유효성 검사기를 작성하고 IValidateableObject 인터페이스를 사용할 수 있습니다. –
유효성 검증을 위해 사용자 정의 속성에 대해 어떻게 생각하십니까? 멋지게 잘 작동 할 수 있습니다 ... – rexdefuror