在运行时更改自定义属性的参数(Change custom attribute's param

2019-06-23 10:19发布

我需要在运行时更改属性的paramater。 我简化我的问题简单的例子。

属性类:

    [AttributeUsage(AttributeTargets.Property)]
    public class MyAttribute : Attribute
    {
        public string Name { get; set; }
    }

简单的实体至极拥有装饰性与属性:

    public class MyEntity
    {
        [MyAttribute(Name="OldValue1")]
        public string Data1{ get; set; }

        [MyAttribute(Name = "OldValue2")]
        public string Data2 { get; set; }
    }

我创建的类myEntity所的instace。 我可以改变对象的属性值,但我不能对对象实体更改属性的属性名称的值。 可能吗?

对对象实体的属性值,我可以用这部分代码更改:

                entityProp.SetValue(entity,"NewData",null);

但我不属性的属性名的对象实体如何变化值

这不工作:

attProp.SetValue(attribute,"NewData",null); 

属性格式名称的值仍然是原来的。

这里是所有的测试代码。 感谢您的HELLP。

    [TestMethod]
    public  void Test()
    {
        var entity = new MyEntity
                         {
                             Data1 = "OldData",
                             Data2 = "OldData"
                         };

        PropertyInfo[] entityProps = entity.GetType().GetProperties();

        foreach (var entityProp in entityProps)
        {
            var attribute = Attribute.GetCustomAttribute(entityProp, typeof (MyAttribute)) as MyAttribute;

            if (attribute != null)
            {
                //get attribute’s property NAME
                PropertyInfo attProp= attribute.GetType().GetProperty("Name");

                //get entity property value
                var propertyValue = entityProp.GetValue(entity, null);

                //get attribute’s property NAME value
                var atributeNameValue = attProp.GetValue(entity, null);

                TestContext.WriteLine(string.Format("property name:{0} property value: {1} : atribute name value: {2}\n", 
                    entityProp.Name, propertyValue, atributeNameValue)); 

                //change values
                entityProp.SetValue(entity,"NewData",null);

                //how can I change value of property Name on object entity ?
                attProp.SetValue(attribute,"NewData",null);

            }

        }

        TestContext.WriteLine(string.Format("After change\n"));

        foreach (var entityProp in entityProps)
        {
            var attribute = Attribute.GetCustomAttribute(entityProp, typeof(MyAttribute)) as MyAttribute;

            if (attribute != null)
            {

                PropertyInfo attProp = attribute.GetType().GetProperty("Name");

                var propertyValue = entityProp.GetValue(entity, null);
                var atributeNameValue = attProp.GetValue(entity, null);

                TestContext.WriteLine(string.Format("property name:{0} property value: {1} : atribute name value: {2}\n",
                    entityProp.Name, propertyValue, atributeNameValue));
            }
        }



    }

编辑:我删除原帖,并添加非常简单明确的样本。 抱歉

Answer 1:

你不能在运行时更改属性。 它们被嵌入到组件的元数据。 您的方法改变特定实例的内部状态; 但是当你再次加载属性,你得到一个不同的实例。



Answer 2:

这是不可能的反射,如(正如已经指出的)中的元数据是固定的。 它是,但是,部分可能与TypeDescriptor,允许添加和在运行时属性的更换,并且提供完全替代模式(TypeDescriptionProvider等)。 这种方法将不被使用的反射的任何代码的尊重,但使用任何TypeDescriptor代码(最典型地,数据绑定和其他UI代码)会注意到的变化。

注意TypeDescriptor只有真正的作品,每典型值/成员的每个属性类型之一; 多实例的属性没有得到很好的支持。



文章来源: Change custom attribute's parameter at runtime