Ä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
InformationsquelleAutor Mike | 2012-04-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht ändern, Attribute zur Laufzeit. Sie sind eingebettet in die Metadaten der assembly. Ihre Methode verändert den internen Zustand der einzelnen Instanz; aber wenn Sie laden Sie das Attribut wieder, Sie sind ein anderes Beispiel.
Du hast Recht ich verbrachte einen ganzen Tag, aber nicht finden konnten, eine Lösung, weil dieses problem keine Lösung. 🙁 also Attribute readonly-Bereich?
InformationsquelleAutor David Nelson
Dies ist nicht möglich, mit Reflexion, als (wie bereits erwähnt) die Metadaten behoben. Es ist jedoch teilweise möglich, mit TypeDescriptor, die erlaubt das hinzufügen und ersetzen von Attributen zur Laufzeit, und die vollständige alternative Modelle (TypeDescriptionProvider, etc). Dieser Ansatz wird nicht respektiert von code, der verwendet reflektion, aber jeden code mit TypeDescriptor (die meisten in der Regel Daten-binding und anderen UI-code) werden die Veränderungen bemerken.
Hinweis TypeDescriptor nur wirklich funktioniert mit jeder Attribut-Typ pro typ/Mitglied; multi-Instanz-Attribute werden nicht unterstützt.
InformationsquelleAutor Marc Gravell