2015-10-24 3 views
0

Я создаю библиотеку для обработки некоторых сетевых устройств. Интерфейс должен возвращать данные типа, зависящие от того, какое конкретное устройство запрашивается. Кроме того, поскольку клиентская система работает с такими динамическими данными с помощью настраиваемых атрибутов, привязанных к свойствам сущностей, мне нужно иметь возможность динамически добавлять атрибуты в свойства моих динамических объектов.Генерация кода времени выполнения, пользовательские атрибуты свойств и 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 является классом членов класса моих тестов?

ответ

0

Ну, я выяснил причину. Я мог бы просто удалить вопрос, но я думаю, что это стоит того.

Моя реализация настраиваемого атрибута была определена как частный член класса класса Tests. После того, как он был изменен на публичный, оба CustomAttributes и GetCustomAttributes возвращают атрибут