gpt4 book ai didi

c# - 反射发射 : how to Convert Attribute instance to CustomAttributeBuilder or CustomAttributeData

转载 作者:太空狗 更新时间:2023-10-29 23:08:44 27 4
gpt4 key购买 nike

我制作了一个生成器类,它基于实现接口(interface)的接口(interface)构建代理类。

查看我在 Build a Proxy class based on Interface without implementing it 上的帖子.

我熟悉CustomAttributeData.GetCustomAttributes(MemberInfo target),我在读取接口(interface)的成员并成功将它们导入代理时使用它。

我想在运行时向生成的类注入(inject)附加 属性。我要求属性实例将它们注入(inject)代理。

例如:

开发人员可以将其作为值传递: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# - 反射发射 : how to Convert Attribute instance to CustomAttributeBuilder or CustomAttributeData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15895802/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com