4

関数からカスタム属性を取得しようとするとobject、関数はを返しますnull。なんで?

class Person
{
    [ColumnName("first_name")]
    string FirstName { get; set; }

    Person()
    {
        FirstName = "not important";
        var attrs = AttributeReader.Read(FirstName);
    }
}

static class AttributeReader
{
    static object[] Read(object column)
    {
        return column.GetType().GetCustomAttributes(typeof(ColumnNameAttribute), false);
    }
}
4

1 に答える 1

14

そのメソッドstringに、を渡します。"not important"したがってType、ですtypeof(string)。これらの属性はありません。さらに、Personその属性もありません。 MemberInfoFirstName)だけがそれらを持っています。

を渡すことによってそれを行う方法がありますExpression

public static ColumnNameAttribute[] Read<T>(Expression<Func<T>> func)
{
    var member = func.Body as MemberExpression;
    if(member == null) throw new ArgumentException(
         "Lambda must resolve to a member");
    return (ColumnNameAttribute[])Attribute.GetCustomAttributes(
         member.Member, typeof(ColumnNameAttribute), false);
}

var attrs = AttributeReader.Read(() => FirstName);

でも!Personコンストラクターがこれに適した場所であるかどうかわからないことをお勧めします。おそらくキャッシュが必要です。

ラムダを使用したくない場合は、aTypeとmember-nameを渡すことも機能します。

var attrs = AttributeReader.Read(typeof(Person), "FirstName");

(そしてそこからの反省を行います)-またはジェネリックとの混合(本当の理由はありません):

var attrs = Attribute.Read<Person>("FirstName");
于 2012-06-04T10:26:29.000 に答える