+-
c# – Reflection Emit:如何将Attribute实例转换为CustomAttributeBuilder或CustomAttributeData
我创建了一个生成器类,它基于实现接口的接口构建代理类.

请参阅我在Build a Proxy class based on Interface without implementing it的帖子.

我熟悉CustomAttributeData.GetCustomAttributes(MemberInfo目标),当我读取Interface的成员并成功将它们导入代理时,我使用它.

我想在运行时向生成的类注入其他属性.
我要求将属性实例注入代理中.

例如:

开发人员可以将其作为值传递:new ObsoleteAttribute(“Demo”,true),(它有一个空构造函数,但属性是只读的),我想将其转换为:

return new CustomAttributeBuilder( attribute.GetType().GetConstructor(Type[] {typeof (string), typeof (bool)}), new object[] {"Demo", true}, new FieldInfo[0], new object[0]);

记住,我不知道给出了什么.

最佳答案
这不是一般解决方案,但如果您愿意将支持的属性限制为具有无参数构造函数和读/写属性和字段的属性,则可以使用它.

CustomAttributeBuilder BuildCustomAttribute(System.Attribute attribute) { Type type = attribute.GetType(); var constructor = type.GetConstructor(Type.EmptyTypes); var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance); var propertyValues = from p in properties select p.GetValue(attribute, null); var fieldValues = from f in fields select f.GetValue(attribute); return new CustomAttributeBuilder(constructor, Type.EmptyTypes, properties, propertyValues.ToArray(), fields, fieldValues.ToArray()); }

要做一般解决方案,您可以使用表达式.这更复杂,但允许语法如下:

BuildCustomAttribute(() => new ObsoleteAttribute("Demo", true));

解析表达式以提取构造函数信息和参数将是复杂的部分,但它可以完成.

CustomAttributeBuilder BuildCustomAttribute(Expression<Action> exp) { //extract ConstructorInfo from exp //extract ParameterValues from exp //extract Attribute Type from exp return new CustomAttributeBuilder(ConstructorInfo, ParameterValues); }
点击查看更多相关文章

转载注明原文:c# – Reflection Emit:如何将Attribute实例转换为CustomAttributeBuilder或CustomAttributeData - 乐贴网