8

インターフェイスを取得し、そこからクラスを継承することを提案しましょう。

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

9 に答える 9

9

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

private string firstName;

public String FirstName
{
    get
    {
        return firstName;
    }
    set
    {
        // validate the input
        if (string.IsNullOrEmpty(value))
        {
            // throw exception, or do whatever
        }
        firstName = value;
    }
}
于 2011-02-09T14:35:58.783 に答える
6

このようなもの...

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

基本的に、プロパティに使用しているのはシンタックス シュガー バージョンです。ここで手動で行っているように、コンパイル時にプライベート メンバー変数を作成し、その変数を使用するようにプロパティを接続します。これの正確な理由は、ロジックを追加したい場合、インターフェイスの実装を壊すことなく、ここにあるような手動のものに変換できるようにするためです。

于 2011-02-09T14:37:34.040 に答える
3

もう少し洗練されたものになっている場合は、検証フレームワークについても言及する必要があります。これらにより、検証ルールの管理がはるかに簡単になり、UIにエラーが表示されると同時に、ルールがモデルに関連付けられたままになるため、定型的な検証コードを繰り返す必要がなくなります。フレームワークのバージョンに応じて、1つのオプションはDataAnnotationsです。

于 2011-02-09T14:41:27.580 に答える
3

または DataAnnotations を使用します

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationattribute.aspx

于 2011-02-09T14:39:17.120 に答える
2

私の知る限り、自動プロパティ構文を使用すると、バッキング フィールドにアクセスできなくなります。ドキュメント (http://msdn.microsoft.com/en-us/library/bb384054.aspx) によると:

C# 3.0 以降では、プロパティ アクセサーに追加のロジックが必要ない場合、自動実装されたプロパティによってプロパティ宣言がより簡潔になります。また、クライアント コードでオブジェクトを作成できるようにします。次の例に示すようにプロパティを宣言すると、コンパイラは、プロパティの get および set アクセサーを介してのみアクセスできるプライベートな匿名バッキング フィールドを作成します。

属性は自動実装プロパティで許可されますが、ソース コードからアクセスできないため、バッキング フィールドでは明らかに許可されません。プロパティのバッキング フィールドで属性を使用する必要がある場合は、通常のプロパティを作成するだけです。

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

于 2011-02-09T14:37:18.740 に答える
0

はい。次のように、プロパティのプライベートバッキングフィールドを作成できます。

private String _firstName;

public String FirstName
{
     get
     {
          return _firstName;
     }
     set
     {
          //Check value for correctness here:
          _firstName = value;
     }
}
于 2011-02-09T14:36:21.630 に答える
0
private DateTime recruitmentDate;    
public DateTime RecruitmentDate
{
    get { return recruitmentDate; }
    set
    {
        validate(value);
        recruitmentDate = value;
    }
}
于 2011-02-09T14:36:44.120 に答える
0

または、フィールドに値の型を使用できませんでした。たとえば、次の実装で「FirstName」クラスを作成できます。

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

他のプロパティについても同様です。次に、コーデルでプロパティを使用するには、次のようにします。

public FirstName MyFirstName;
var x = MyFirstName.Value;

検証するフィールドが多数ある場合、これは面倒なアプローチになる可能性があります。ints > 0ただし、正の数 ( )、カウント ( int >= 0)、メジャーなど、特定の種類の数値を処理するように一般化できます。

文字列は、値の型 (特殊文字なし、数字なしなど) に加えて長さの制限があることが多いため、より困難です。これは、継承クラスのコンストラクターで設定される読み取り専用の長さプロパティを持つことで対応できる場合があります。 .

于 2013-05-20T20:08:10.067 に答える
0

C# でプロパティの取得/設定中にカスタム ロジックを実行できるということであれば、答えはイエスです。

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

あなたはそれを自分で提供する必要があります

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

get ブロックと set ブロックでカスタム検証コードを実行できるようになりました。

于 2011-02-09T14:37:20.857 に答える