Ist es möglich, zur Laufzeit Attribute hinzuzufügen oder den Wert eines Attributs zur Laufzeit zu ändern?
Antworten
Zu viele Anzeigen?Wie in einem Kommentar von Deczaloth unten erwähnt, denke ich, dass Metadaten zur Kompilierungszeit festgelegt werden. Ich erreiche dies, indem ich ein dynamisches Objekt erstelle, in dem ich GetType() überschreibe oder GetCustomType() verwende und meinen eigenen Typ schreibe. Auf diese Weise könnte man dann...
Ich versuchte sehr hart mit System.ComponentModel.TypeDescriptor ohne Erfolg. Das bedeutet nicht, dass es nicht funktionieren kann, aber ich würde gerne Code für das sehen.
Im Gegenstück wollte ich einige Attributwerte ändern. Ich habe 2 Funktionen, die für diesen Zweck gut funktionieren.
// ************************************************************************
public static void SetObjectPropertyDescription(this Type typeOfObject, string propertyName, string description)
{
PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName];
var att = pd.Attributes[typeof(DescriptionAttribute)] as DescriptionAttribute;
if (att != null)
{
var fieldDescription = att.GetType().GetField("description", BindingFlags.NonPublic | BindingFlags.Instance);
if (fieldDescription != null)
{
fieldDescription.SetValue(att, description);
}
}
}
// ************************************************************************
public static void SetPropertyAttributReadOnly(this Type typeOfObject, string propertyName, bool isReadOnly)
{
PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName];
var att = pd.Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute;
if (att != null)
{
var fieldDescription = att.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
if (fieldDescription != null)
{
fieldDescription.SetValue(att, isReadOnly);
}
}
}
In Java habe ich dieses Problem durch die Verwendung einer Map und die Implementierung meiner eigenen Variante der Schlüssel-Wert-Kodierung umgangen.
http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html
- See previous answers
- Weitere Antworten anzeigen
0 Stimmen
Ist damit Ihre Frage beantwortet? Hinzufügen eines Attributs zu einer Eigenschaft zur Laufzeit