如何在没有属性构造函数(Reflection.Emit)的情况下将值添加到动态添加到属性的属性中

本文关键字:属性 添加 情况下 动态 Emit 构造函数 Reflection | 更新日期: 2023-09-27 18:22:23

我能够添加Attribute并通过constructor传递values。但是,当Attribute没有具有适当参数的constructor时,如何通过values。例如,如何添加此DisplayAttribute using Reflection.Emit

[Display(Order = 28, ResourceType = typeof(CommonResources), Name = "DisplayComment")]

希望它足够清楚我正在努力实现的目标。如果没有,请询问。

如何在没有属性构造函数(Reflection.Emit)的情况下将值添加到动态添加到属性的属性中

您使用CustomAttributeBuilder。例如:

var cab = new CustomAttributeBuilder(
    ctor, ctorArgs,
    props, propValues,
    fields, fieldValues
);
prop.SetCustomAttribute(cab);

(或相关过载之一)

在你的情况下,这看起来(这纯粹是猜测)类似于:

var attribType = typeof(DisplayAttribute);
var cab = new CustomAttributeBuilder(
    attribType.GetConstructor(Type.EmptyTypes), // constructor selection
    new object[0], // constructor arguments - none
    new[] { // properties to assign to
        attribType.GetProperty("Order"),
        attribType.GetProperty("ResourceType"),
        attribType.GetProperty("Name"),
    },
    new object[] { // values for property assignment
        28,
        typeof(CommonResources),
        "DisplayComment"
    });
prop.SetCustomAttribute(cab);

注意,我假设OrderResourceTypeName属性。如果它们是字段,则存在不同的过载。