web-dev-qa-db-ja.com

C#属性を使用したリフレクションによるプロパティ値の設定

以下のように、プロパティの値である提供されたデータ行の列を指定するclassesプロパティの属性を介してオブジェクトを構築しようとしています。

    [StoredDataValue("guid")]
    public string Guid { get; protected set; }

    [StoredDataValue("PrograGuid")]
    public string ProgramGuid { get; protected set; }

ベースオブジェクトのBuild()メソッドで、これらのプロパティに設定された属性値を次のように取得しています。

        MemberInfo info = GetType();
        object[] properties = info.GetCustomAttributes(true);

しかし、この時点で私は自分の知識の限界に気づいています。

まず、正しい属性を取り戻しているようには見えません。

そして、属性を持っているので、リフレクションを介してこれらのプロパティを設定するにはどうすればよいですか?私は根本的に間違ったことをしている/考えていますか?

18
johnc

ここにはいくつかの個別の問題があります

  • typeof(MyClass).GetCustomAttributes(bool)(またはGetType().GetCustomAttributes(bool))は、メンバーの属性ではなく、クラス自体の属性を返します。クラス内のプロパティのリストを取得するには、typeof(MyClass).GetProperties()を呼び出してから、それぞれをチェックする必要があります。

  • プロパティを取得したら、探している属性が正確にわかっているので、Attribute.GetCustomAttribute()ではなくMemberInfo.GetGustomAttributes()を使用する必要があると思います。

開始に役立つ小さなコードスニペットを次に示します。

_PropertyInfo[] properties = typeof(MyClass).GetProperties();
foreach(PropertyInfo property in properties)
{
    StoredDataValueAttribute attribute =
        Attribute.GetCustomAttribute(property, typeof(StoredDataValueAttribute)) as StoredDataValueAttribute;

    if (attribute != null) // This property has a StoredDataValueAttribute
    {
         property.SetValue(instanceOfMyClass, attribute.DataValue, null); // null means no indexes
    }
}
_

[〜#〜] edit [〜#〜]Type.GetProperties()はデフォルトでパブリックプロパティのみを返すことを忘れないでください。他の種類のプロパティも取得するには、Type.GetProperties(BindingFlags)を使用する必要があります。

38
Tamas Czinege