Я создаю библиотеку для обработки некоторых сетевых устройств. Интерфейс должен возвращать данные типа, зависящие от того, какое конкретное устройство запрашивается. Кроме того, поскольку клиентская система работает с такими динамическими данными с помощью настраиваемых атрибутов, привязанных к свойствам сущностей, мне нужно иметь возможность динамически добавлять атрибуты в свойства моих динамических объектов.Генерация кода времени выполнения, пользовательские атрибуты свойств и CustomAttributes по сравнению с GetCustomAttributes
Вот как я создаю тип объекта и украсить свойство с атрибутом (я опустил код для определения либо получений и установки или поля подкладочного)
// creates type builder for requested entity schema
var typeBuilder = GetTypeBuilder();
var attrType = typeof(TestAttribute);
var propertyBuilder = typeBuilder.DefineProperty("TestProp", PropertyAttributes.HasDefault, propertyType, null);
var ctorInfo = attrType.GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).FirstOrDefault();
var attributeBuilder = new CustomAttributeBuilder(ctorInfo, new object[] { },
// here I pass collections of data in order to initialize the attribute
attrProperties.ToArray(), attrPropertiesValues.ToArray(),
attrFields.ToArray(), attrFieldsValues.ToArray());
propertyBuilder.SetCustomAttribute(attributeBuilder);
var type = typeBuilder.CreateType();
и вот как я позже проверить наличие атрибута на свойстве
var obj = Activator.CreateInstance(type);
var prop = obj.GetType().GetProperties().First(x => x.Name == "TestProp");
var attributes = prop.GetCustomAttributes(typeof(TestAttribute), false);
проблема заключается в том, что последняя строка кода (вызывающего GetCustomAttributes
) дает мне пустой массив, а свойство prop.CustomAttributes
содержит массив из одного элемента, и этот элемент это моя TestAttribute
.
Может ли кто-нибудь объяснить мне разницу? Я думаю, мне нужно, чтобы этот GetCustomAttributes
работал, так как я не могу быть уверен, какой способ получить атрибуты используется в клиентской системе.
Имеет ли значение, что TestAttribute
является классом членов класса моих тестов?