3

背景: データベーステーブルを表すカスタムクラスがあり、各プロパティはテーブルの列に対応しています。プロパティは3つの方法で分類できます。

例: Personオブジェクトを例にとってみましょう。

  • MetaProperties :(プログラムに必要な列)
    • Person_ID:インデックス作成などのテーブルで使用されます。
    • UserDefinedType:(UDT)、テーブルの書き込み権限を処理する複雑なクラス
    • タイムスタンプ:C#DataTablesでUDTを処理するために必要
  • RealProperties :(実在の人物を表す実際の特性)
    • フルネーム
    • 生年月日
    • 出生地
    • 目の色
    • など... (もっとたくさん)
  • RawDataProperties :(これらの列は外部ソースからの生データを保持します)

    • Phys_EyeColor:物理特性データベースから直接インポートされた目の色は、不明な形式である可能性があり、他のデータベースからのエントリと競合する値を持っている可能性があります、または他のデータ品質の問題...
    • HR_FullName:HRファイルで指定されたフルネーム
    • Web_FullName:Webフォームから取得したフルネーム
    • Web_EyeColor:Webフォームから取得した目の色
    • 等...

    パブリッククラスPerson{

    #region MetaProperties
    
    public int Person_ID { get; set; }
    public UserDefinedType UDT { get; set; }
    public DateTime timestamp { get; set; }
    
    #endregion
    
    
    #region RealProperties
    
    public string FullName { get; set; }
    public DateTime DateOfBirth { get; set; }
    public string PlaceOfBirth { get; set; }
    public Color EyeColor { get; set; }
    //...
    
    #endregion
    
    
    #region RawDataProperties
    
    public string Phys_EyeColor { get; set; }
    public string Phys_BodyHeight { get; set; }
    
    public string Web_FullName { get; set; }
    public string Web_EyeColor { get; set; }
    
    public string HR_FullName { get; set; }
    //...
    #endregion
    

    }

質問: Personクラスでこれら3つのタイプのプロパティをプログラムで区別するにはどうすればよいですか?System.Reflection目標は、または他の組織構造を使用して、特定のタイプのプロパティを反復処理できるようにすることです。擬似コード:

foreach(Property prop in Person.GetPropertiesOfType("RealProperty"){
... doSmth(prop);
}

タグギンのように、カスタム属性を作成してプロパティにぶら下げることを考えています。しかし、私はカスタム属性について何も知らないので、私が適切な道を進んでいるかどうか、またはこれを行うための他のより良い方法があるかどうかを尋ねたいと思います。

注:示されている例は、プログラム設計の観点からは最適ではない可能性があります。継承またはクラスの分割がなければ、この問題を解決できることを私はよく知っています。しかし、それは私の質問ではありません-クラス内のプロパティにタグを付けることができるか、またはカスタムカテゴリの使用を何らかの方法で区別できるかどうかを知りたいです

4

1 に答える 1

5

これは、カスタム属性を使用して行うことができます。

    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
    public class PropertyAttribute : System.Attribute
    {
       public PropertyType Type { get; private set; }
       public PropertyAttribute (PropertyType type) { Type = type; }
    }

    public enum PropertyType
    {
       Meta,
       Real,
       Raw,
    }

次に、各プロパティまたはフィールドでこれを行うことができます。

[PropertyType(PropertyType.Meta)]
public int Person_ID;
[PropertyType(PropertyType.Real)]
public string FullName;
[PropertyType(PropertyType.Raw)]
public string Phys_EyeColor;

次に、次のようなものでアクセスできます

foreach (PropertyAttribute attr in this.GetType().GetCustomAttributes(typeof(PropertyAttribute), false))
{
    // Do something based on attr.Type
}
于 2012-10-11T16:48:49.550 に答える