Можно ли пройти через свойства, которые имеют определенную аннотацию данных и определенное значение? .NET C # - PullRequest
2 голосов
/ 16 февраля 2011

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

[Objective].

Я хочу поместить в мою модель представления только те записи, которые имеют значение «Y» И которые украшены атрибутом [Objective]

Возможна ли такая вещь?

1 Ответ

5 голосов
/ 16 февраля 2011

Да, это возможно с помощью отражения. Я реализовал нечто подобное для фабрики, чтобы создать свойства зависимостей для WPF . Весь исходный код можно найти здесь .

Соответствующий кусок кода:

// Check all properties for a dependency property attribute.
const BindingFlags ALL_PROPERTIES = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
var matchingProperties = new Dictionary<PropertyInfo, DependencyPropertyAttribute>();
foreach ( PropertyInfo property in m_ownerType.GetProperties( ALL_PROPERTIES ) )
{
    object[] attribute = property.GetCustomAttributes( typeof( DependencyPropertyAttribute ), false );
    if ( attribute != null && attribute.Length == 1 )
    {
        // A correct attribute was found.
        DependencyPropertyAttribute dependency = (DependencyPropertyAttribute)attribute[ 0 ];

        // Check whether the ID corresponds to the ID required for this factory.
        if (dependency.GetId() is T)
        {
            matchingProperties.Add(property, dependency);
        }
    }
}

Между тем я уже абстрагировал это поведение в иерархии абстрактных классов, потому что я делал нечто подобное при создании фабрики, чтобы упростить создание моделей представления , но я считаю, что приведенный выше код уже отвечает на ваш вопрос. Исходный код этой абстрактной «фабрики» можно найти здесь .

UPDATE:

Чтобы получить доступ к значению свойства, используйте PropertyInfo.GetValue () . Разумеется, вам понадобятся ссылки на экземпляры вашего класса.

...