运行时代码生成,属性上的自定义属性和CustomAttributes与GetCustomAttributes

时间:2015-10-24 16:35:04

标签: c# reflection custom-attributes reflection.emit

我正在建立一个用于处理某些网络设备的库。接口需要返回类型的数据,这取决于查询的特定设备。此外,由于客户端系统通过附加到实体属性的自定义属性处理此类动态数据,因此我需要能够动态地将属性添加到我的动态实体中。属性。

以下是我如何创建实体类型并使用属性修饰属性(我省略了用于定义getter和setter或支持字段的代码)

// 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是我测试的成员类是否重要?套房类?

1 个答案:

答案 0 :(得分:0)

好吧,我找到了原因。我可以删除这个问题,但我认为值得分享。

我的自定义属性实现被定义为Tests类的私有类成员。将其更改为公开后,CustomAttributesGetCustomAttributes都会返回属性