Получить значение из свойства, украшенного пользовательским атрибутом?

Я написал пользовательский атрибут, который я использую для определенных членов класса:

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

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

Я могу получить пользовательские атрибуты из типа и найти свой конкретный атрибут. Чего я не могу понять, как это сделать, так это получить значения назначенных свойств. Когда я беру экземпляр Dummy и передаю его (как объект) моему методу, как я могу взять объект PropertyInfo, который я получаю из .GetProperties(), и получать значения, присвоенные .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 - Object не соответствует целевому типу. Как мне структурировать этот вызов, чтобы получить это значение?


person Joe    schedule 03.02.2011    source источник


Ответы (2)


Вам нужно передать сам объект в GetValue, а не объект свойства:

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

И еще один момент - вы должны использовать не .First(), а .FirstOrDefault(), потому что ваш код будет генерировать исключение, если какое-то свойство не содержит атрибутов:

object attr = (from row in propattr 
               where row.GetType() == typeof(MyAttribute) 
               select row)
              .FirstOrDefault();
person EvgK    schedule 04.02.2011
comment
Согласен с FirstOrDefault - это в основном надуманный пример для демонстрации проблемы, но спасибо за помощь. Ох, не верится, что это было. - person Joe; 04.02.2011

Вы получаете массив PropertyInfo, используя .GetProperties(), и вызываете PropertyInfo.GetValue Метод для каждого

Назовите это так:

var value = prop.GetValue(o, null);
person Andrey    schedule 03.02.2011
comment
уточнить; OP потребуется экземпляр класса Dummy, чтобы получить от него значение свойства. Типа самого по себе недостаточно. - person KeithS; 04.02.2011
comment
Я обновил свой вопрос - моя проблема именно с .GetValue и с тем, как его вызвать, чтобы он действительно работал. - person Joe; 04.02.2011