Ändern Sie das benutzerdefinierte Attribut - parameter zur Laufzeit

Muss ich ändern-Attribut - Parameter während der runtime. Ich vereinfachte meine problem zu einfaches Beispiel.

Attribut-Klasse:

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

Einfache entity, welches eingerichtet Eigenschaften mit Parametern:

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

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

Ich erstellt instace von der Klasse MyEntity. Ich kann verändern Sie den Wert der Objekteigenschaften, aber ich kann nicht ändern Sie den Wert des Attributs Name der Eigenschaft auf das Objekt Person. Ist es möglich?

Wert der Immobilie auf Objekt-Entität, ändern kann ich mit diesem Teil des Codes:

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

aber ich weiß nicht, wie ändern Sie den Wert des Attributs Name der Eigenschaft auf dem Objekt Person

Diese nicht funktionieren:

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

Wert der Anwesen Namen ist noch original.

Hier alle test-code. Danke für 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));
            }
        }



    }

BEARBEITET: ich habe löschen der ursprünglichen post und fügte hinzu, sehr einfache, klare Muster. Sorry

Randnotiz: warum ist deine zweite Methode fangen und werfen dann die Ausnahme?

InformationsquelleAutor Mike | 2012-04-06

Schreibe einen Kommentar