Я столкнулся с проблемой, которая не решена общедоступными решениями, по-видимому, одной и той же проблемой.Получить атрибут от динамически генерируемого класса
Рассмотрим:
У меня есть набор динамически создаваемых классов, наследуя от известного базового класса (назовем его BaseClass
). Эти динамически генерируемые классы также динамически генерируют Properties
со связанными атрибутами.
Атрибуты также из пользовательского класса, хотя и не генерируются динамически:
[AttributeUsage(AttributeTargets.Property)]
class TypeAttribute: Attribute
{
private Type _type;
public Type Type
{
get { return _type; }
}
public TypeAttribute(Type t)
{
_type = t;
}
}
Тогда я хочу, во время выполнения, конечно, получить значение этого назначенного атрибута:
List<PropertyInfo> result = target.GetType()
.GetProperties()
.Where(
p =>
p.GetCustomAttributes(typeof(TypeAttribute), true)
//.Where(ca => ((TypeAttribute)ca).)
.Any()
)
.ToList();
где target
является подклассом BaseClass
. Однако список result
пуст, и это меня озадачивает.
добавить атрибут с помощью
PropertyBuilder propertyBuilder = tb.DefineProperty(propertyName,
PropertyAttributes.HasDefault, propertyType, null);
ConstructorInfo classCtorInfo = typeof(TypeAttribute).
GetConstructor(new Type[] { typeof(Type) });
CustomAttributeBuilder myCABuilder = new CustomAttributeBuilder(
classCtorInfo, new object[] { getType(dataType) });
propertyBuilder.SetCustomAttribute(myCABuilder);
где dataType
типа для хранения в атрибуте и tb
является TypeBuilder
для класса.
Если у меня есть getCustomAttributes()
, я получаю ожидаемые атрибуты, кроме тех, которые я ищу. Но если я делаю getCustomAttributesData()
, я получаю все из них, но тот, который я ищу, имеет тип CustomAttributeData
и не может быть отнесен к TypeAttribute
(если я исследую экземпляр в отладчике VS, я могу видеть, что содержащаяся информация относится к TypeAttribute
). Я предполагаю, что это симптом проблемы, но я не могу найти причину - и тем более решение.
Может кто-нибудь указать мне, почему список result
пуст?
ooh, это весело; для меня потребуется несколько минут, чтобы создать тестовую установку ... Я надеюсь, что кто-то обнаружит что-то очевидное, пока я это делаю! –