C# установка значений свойств посредством отражения с атрибутами

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

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

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

Во-первых, мне кажется, что я не получаю обратно правильные атрибуты.

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
19
0
42 190
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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
    }
}

РЕДАКТИРОВАТЬ: Не забывайте, что Type.GetProperties() по умолчанию возвращает только общедоступные свойства. Вам придется использовать Type.GetProperties(BindingFlags), чтобы получить и другие свойства.

Я провожу это испытание и дам вам знать, хотя выглядит логично

johnc 24.12.2008 04:59

Attribute.GetCustomAttribute (...) возвращает массив System.Attribute и не может быть просто приведен к самому атрибуту. Показанный пример даже не компилируется, не говоря уже о работе. Вам нужно проверить длину массива, чтобы увидеть, существует ли желаемый атрибут, и вместо этого привести первый элемент к требуемому типу.

Gone Coding 17.04.2012 23:10

В примере используется GetCustomAttribute, а не GetCustomAttributes. Пример компилируется, когда я его пробую (конечно, меняя имя атрибута).

Ricky Helgesson 09.06.2012 17:23

Другие вопросы по теме