0

データベース列をプロパティにマップするために使用される単純な属性を実装したいと考えています。

だから私がこれまでに持っているのは、次のように取り付けられたものです:

    [DataField("ID")]
    public int ID { get; set; }

    [DataField("Name")]
    public String Name { get; set; }

    [DataField("BirD8")]
    public DateTime BirthDay { get; set; }

名前がColumnNameと同じであるプロパティの場合、nameパラメーターなしで属性を適用できるように、属性がフィールドを「認識」できるようにする方法はありますか、またはする必要がありますプロパティを反映する時点でそれを処理します。私はこれだけをやってしまいたい:

    [DataField]
    public int ID { get; set; }

    [DataField]
    public String Name { get; set; }

    [DataField("BirD8")]
    public DateTime BirthDay { get; set; }
4

2 に答える 2

3

属性自体は、それが何に適用されているかを認識しませんが、属性を処理PropertyInfoするコードは、値などを処理し、それらに関連付けられた属性を見つける可能性があります。そのコードは、プロパティと属性の両方を適切に使用できます。

物事を簡単にするために、属性にメソッドを記述して、その情報をプロパティからの情報とマージできるようにすることができます。そのため、次のように呼び出します。

DataFieldAttribute dfa = propertyInfo.GetCustomAttributes(...); // As normal
dfa = dfa.MergeWith(propertyInfo);

健全性のために、既存のインスタンスを変更するのではなく、属性の新しいインスタンスを作成する必要があることに注意してください。あるいは、別のクラス全体で「データ フィールドに関する情報」を表すこともできます。

DataFieldAttribute dfa = propertyInfo.GetCustomAttributes(...); // As normal
DataFieldInfo info = dfa.MergeWith(propertyInfo);

そうすれば、属性への参照なしでオブジェクトを構築することDataFieldInfoできます。これは、概念的な分離として優れている可能性があります。必要に応じて、XML ファイルまたは同様のものから構成を簡単にロードできます。

于 2009-10-20T06:50:12.130 に答える
1

Postsharp を使用してもかまわない場合は、こちらを見ることができます。以前の質問で、どちらが近いかを尋ねました。CompileTimeInitalize.

public override void CompileTimeInitialize(object element)
{
    PropertyInfo info = element as PropertyInfo;

    //....
}
于 2009-10-20T07:16:56.227 に答える