2011-07-01 4 views

답변

26

메타 데이터 클래스를 사용해보십시오. 간접적으로 모델 클래스에 데이터 주석을 추가 할 수있는 속성을 사용하여 참조되는 별도의 클래스입니다.

[MetadataType(typeof(MyModelMetadata))] 
public class MyModel : MyModelBase { 
    ... /* the current model code */ 
} 


internal class MyModelMetadata { 
    [Required] 
    public string Name { get; set; } 
} 
+0

아무도 downvote에 대한 코멘트 신경? 엄밀히 말하면 이것은 나에게 정확 해 보인다. (원래의 대답과 비슷한 것을 추가했다.) –

+1

내 생각 엔 DataAnnotations 네임 스페이스의 특성에 대해서만 작동하므로 일반 솔루션이 아닐 것입니다. – Marchy

+2

[MSDN] (https://msdn.microsoft.com/en-us/library/ff664465%28v=pandp.50%29.aspx)에는 ** MyModel **이 부분적이어야한다고 나와 있습니다. –

27

가상으로 상위 클래스의 속성을 선언 : 당신이 DataAnnotations 대해 얘기로 ... 한 (

public class MyModelBase 
{ 
    public virtual string Name { get; set; } 
} 

public class MyModel : MyModelBase 
{ 
    [Required] 
    public override string Name { get; set; } 

    public string SomeOtherProperty { get; set; } 
} 

또는 유효성 검증을 처리하는 MetadataType를 사용할 수 있습니다 그렇지 않으면 ' 위의 예제와 다시 붙어서) :

class MyModelMetadata 
{ 
    [Required] 
    public string Name { get; set; } 

    public string SomeOtherProperty { get; set; } 
} 

[MetadataType(typeof(MyModelMetadata))] 
public class MyModel : MyModelBase 
{ 
    public string SomeOtherProperty { get; set; } 
} 
+1

당신이 잃고 싶지 않은 추가 행동이 있다면이 방법이 있습니다. +1 – Yuck

+0

이제 기본 생성자에서 잠재적 인 가상 호출을주의해야합니다. – nicodemus13

+3

[MSDN] (https://msdn.microsoft.com/en-us/library/ff664465%28v=pandp.50%29.aspx)에 따르면 ** MyModel **은 부분적이어야합니다. –

8

이러한 대답 중 실제로는 기본 Name 속성을 올바르게 호출하지 않습니다. 재정의는 새 속성에 대해 별도의 값이 없도록 다음과 같이 작성해야합니다.

public class MyModelBase 
{ 
    public virtual string Name { get; set; } 
} 

public class MyModel : MyModelBase 
{ 
    [Required] 
    public override string Name { get { return base.Name; } set { base.Name = value; } 

    public string SomeOtherProperty { get; set; } 
} 
+0

나는 그것이 왜 필요한지를 보지 못한다. 만약 당신이 말하는 것이 사실이라면,이 코드는 작동하지 않아야합니다. 그러나 작동합니다 : http://csharppad.com/gist/c5db27fb3b90f961a2da. 그 컴파일러는 재정의 된 자동 속성을 자동으로 처리합니다. – Spook

+0

@ Spook 기본 클래스 (예 : Setter의 RaisePropertyChanged)에서 사용자 지정 구현이 필요한 경우에만 필요하다고 생각합니다. 하위 클래스에서 자동 속성 만 사용하면 기본 클래스의 getter/setter가 호출되지 않습니다. – Ryan

0

"new"키워드로 기본 속성을 오버로드 할 수 있습니다.

public class MyModelBase 
{ 
    public string Name { get; set; } 
} 

public class MyModel : MyModelBase 
{ 
    [Required] 
    public new string Name {get; set;} 
    public string SomeOtherProperty { get; set; } 
} 
+0

무엇을위한 Downvote? – ahmet

+1

이것은 "작동"하지만 다형성을 파괴합니다. 다음 코드를 작성하면 "무언가"가 null이됩니다. MyModel m = new MyModel(); m.Name = "Blah"; MyModelBase mb = m; var something = mb.Name; – raterus

+0

새 키워드 오버로딩이 위험하다고합니까? 그럼 그게 뭡니까? – ahmet

관련 문제