12

クラスの特定のメンバーで使用するカスタム属性を作成しました。

public class Dummy
{
    [MyAttribute]
    public string Foo { get; set; }

    [MyAttribute]
    public int Bar { get; set; }
}

タイプからカスタム属性を取得して、特定の属性を見つけることができます。方法がわからないのは、割り当てられたプロパティの値を取得することです。Dummyのインスタンスを取得し、それを(オブジェクトとして)メソッドに渡す場合、.GetProperties()から取得したPropertyInfoオブジェクトを取得して、.Fooと.Barに割り当てられた値を取得するにはどうすればよいですか?

編集:

私の問題は、GetValueを適切に呼び出す方法がわからないことです。

void TestMethod (object o)
{
    Type t = o.GetType();

    var props = t.GetProperties();
    foreach (var prop in props)
    {
        var propattr = prop.GetCustomAttributes(false);

        object attr = (from row in propattr where row.GetType() == typeof(MyAttribute) select row).First();
        if (attr == null)
            continue;

        MyAttribute myattr = (MyAttribute)attr;

        var value = prop.GetValue(prop, null);
    }
}

ただし、これを行うと、prop.GetValue呼び出しでTargetExceptionが発生します-オブジェクトがターゲットタイプと一致しません。この値を取得するためにこの呼び出しを構成するにはどうすればよいですか?

4

2 に答える 2

12

プロパティオブジェクトではなく、オブジェクト自体をGetValueに渡す必要があります。

var value = prop.GetValue(o, null);

そしてもう1つ、.First()ではなく.FirstOrDefault()を使用する必要があります。これは、一部のプロパティに属性が含まれていない場合、コードが例外をスローするためです。

object attr = (from row in propattr 
               where row.GetType() == typeof(MyAttribute) 
               select row)
              .FirstOrDefault();
于 2011-02-04T08:28:48.073 に答える
3

PropertyInfo使用の配列を取得し、それぞれでPropertyInfo.GetValueメソッド .GetProperties()を呼び出します

このように呼んでください:

var value = prop.GetValue(o, null);
于 2011-02-03T23:56:13.503 に答える