2011-02-09 11 views
3

はのは、私はインターフェイスを持ってお勧めさせ、そこからクラスを継承し、検証プロパティ

internal interface IPersonInfo 
{ 
    String FirstName { get; set; } 
    String LastName { get; set; } 
} 
internal interface IRecruitmentInfo 
{ 
    DateTime RecruitmentDate { get; set; } 
} 

public abstract class Collaborator : IPersonInfo, IRecruitmentInfo 
{ 
    public DateTime RecruitmentDate 
    { 
     get; 
     set; 
    } 
    public String FirstName 
    { 
     get; 
     set; 
    } 
    public String LastName 
    { 
     get; 
     set; 
    } 
    public abstract Decimal Salary 
    { 
     get; 
    } 
} 

は、その後どのように私は協力者クラス内の文字列を検証するのですか?内部プロパティを実装することは可能ですか?

答えて

4

はい、自動プロパティを使用していません。手動でバッキングフィールドを持つプロパティを実装する必要があります。

private string firstName; 

public String FirstName 
{ 
    get 
    { 
     return firstName; 
    } 
    set 
    { 
     // validate the input 
     if (string.IsNullOrEmpty(value)) 
     { 
      // throw exception, or do whatever 
     } 
     firstName = value; 
    } 
} 
+0

23秒で殴られます:) – GWLlosa

0

はい。

private String _firstName; 

public String FirstName 
{ 
    get 
    { 
      return _firstName; 
    } 
    set 
    { 
      //Check value for correctness here: 
      _firstName = value; 
    } 
} 
0
private DateTime recruitmentDate;  
public DateTime RecruitmentDate 
{ 
    get { return recruitmentDate; } 
    set 
    { 
     validate(value); 
     recruitmentDate = value; 
    } 
} 
2

あなたは自動プロパティの構文を使用している場合私の知る限りでは、あなたはバッキングフィールドにアクセスする能力を失う:あなたはこのように、プロパティのプライベートバッキングフィールドを作成することができます。ドキュメント(http://msdn.microsoft.com/en-us/library/bb384054.aspx)によれば:

のC#3.0以降では、自動実装 特性は、プロパティ宣言は より簡潔にします追加のロジックがない場合は、プロパティアクセサーで が必要です。 クライアントコードで オブジェクトを作成することもできます。次の例に示すように プロパティを宣言すると、 コンパイラは、 のバックアンドフィールドを作成します。このフィールドは、 の場合は、 のgetとaccessorを使用してアクセスできます。これらは ソースコードからアクセスできないため、

属性は 自動実装プロパティが、バッキングフィールド で明らかに ないで許可されています。 プロパティのバッキングフィールドに 属性を使用する必要がある場合は、通常の プロパティを作成してください。

したがって、唯一の解決策は、通常のプロパティを作成することです。

0

C#でプロパティの取得/設定中にカスタムロジックを実行できる場合は、答えは「はい」です。

バッキングストアとロジックがデフォルト設定されている自動プロパティと呼ばれるものを使用しています。

あなたは今、あなたはあなたのGETのカスタム検証コードを実行してブロックを設定することができます

private int backingStoreVariable; 
public property MyProperty 
{ 
    get 
    { 
     return this.backingStoreVariable; 
    } 
    set 
    { 
     this.backingStoreVariable=value; 
    } 
} 

のようにそれを自分で用意する必要があります。あなたがプロパティに使用しているもの

3

このような何か...基本的に

private string _firstName; 
public string FirstName 
{ 
    get 
    { 
     return _firstName; 
    } 
    set 
    { 
     if (value != "Bob") 
      throw new ArgumentException("Only Bobs are allowed here!"); 
     _firstName = value; 
    } 
} 

は、シンタックスシュガーバージョンです。コンパイル時に、私はここで手作業でやっているように、プライベートメンバ変数を作成し、その変数を使用するプロパティを配線します。ロジックの追加が必要な場合は、インターフェイスの実装を破ることなくここにあるように、ロジックを手動のものに変換できます。あなたはもう少し洗練された取得している場合

2

も検証フレームワークを言及する必要があります。検証ルールをより簡単に管理できるようにするとともに、ルールをモデルに結びつけたままでUIにエラーを表示するので、定型的な定型的な検証コードを繰り返す必要はありません。フレームワークのバージョンに応じて、1つのオプションはDataAnnotationsです。

0

また、フィールドに値の種類を使用できませんでした。たとえば、次のような実装で「姓」クラスを作成することができます。

public class FirstName 
{ 
    private string _Value; 
    public string Value 
    { 
     get 
     { 
      return _Value; 
     } 
     set 
     { 
      if (string.IsNullOrEmpty(value)) 
       throw new ArgumentNullException("Value cannot be null"); 
      if (value.Length > 128) 
       throw new ArgumentOutOfRangeException("Value cannot be longer than 128 characters"); 
      _Value = value; 
     } 
    } 

    public FirstName(string initialValue) 
    { 
     Value = initialValue; //does validation check even in constructor 
    } 
} 

最後に、あなたのコードサンプルではあなたは、単に持っているでしょう上:あなたの他のプロパティと

public interface IPersonInfo 
{ 
    FirstName FirstName { get; set; } 
    String LastName { get; set; } 
} 

などを。 は、その後、あなたのCODELでプロパティを使用するには、持っているでしょう:

public FirstName MyFirstName; 
var x = MyFirstName.Value; 

あなたが検証したいフィールドの多くを持っている場合、これは面倒なアプローチになってしまうかもしれません。しかし、正の数(ints > 0)、数(int >= 0)、数値などのような特定の種類の数値を処理するように一般化できます。

文字列は値型に加えて長さの制限これは、継承するクラスのコンストラクタで設定された読み取り専用の長さプロパティを持つことで対応できます。

関連する問題