Да, это возможно с помощью отражения. Я реализовал нечто подобное для фабрики, чтобы создать свойства зависимостей для 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 () . Разумеется, вам понадобятся ссылки на экземпляры вашего класса.