2011-07-01 8 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

仮想として親クラスのプロパティを宣言します。

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; } 
} 

それとも、あなたがそうでなければ...限り、あなたはDataAnnotations話していると(検証を処理するた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

これは "動作"しますが、多型を破ります。次のコードを書くと "something"はnullになります。 MyModel m = new MyModel(); m.Name = "Blah"; MyModelBase mb = m; var something = mb.Name; – raterus

+0

新しいキーワードのオーバーロードは危険ですか?それは何のためですか? – ahmet

関連する問題