C # установка значений свойств через отражение с атрибутами - PullRequest
18 голосов
/ 24 декабря 2008

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

    [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);

Однако в этот момент я осознаю ограничение в моих знаниях.

Для начала я, похоже, не получаю правильные атрибуты.

И как мне установить эти свойства с помощью отражения, теперь, когда у меня есть атрибуты? Я делаю / думаю что-то принципиально неправильное?

1 Ответ

38 голосов
/ 24 декабря 2008

Здесь есть несколько отдельных вопросов

  • 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), чтобы получить и другие виды свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...