Подтвердить что ты не робот

Значения свойств значения С# через отражение с атрибутами

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

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

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

Для начала я не вернусь к правильным атрибутам.

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

4b9b3361

Ответ 1

Здесь есть несколько отдельных проблем.

  • 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) для получения других видов свойств.