Property - Dynamisch wechselnde ReadOnlyAttribute
-
10-07-2019 - |
Frage
Seufz, eine andere Property Frage. Ich dachte, ich könnte dieses Problem umgehen, bis ich in ein Problem lief, wo ich konnte nicht wirklich es vermeiden.
Ich habe eine Boolesche Eigenschaft, die manchmal und manchmal braucht werden nur gelesen werden muss veränderbar sein abhängig von dem Objekt aus einem TreeView ausgewählt.
Meine Frage ist, wie kann ich die ReadOnlyAttribute einer Eigenschaft dynamisch ändern? Offensichtlich eine boolesche Variable erstellen und dann versuchen, es zu setzen wie ReadOnlyAttribute (Boolvar) nicht funktioniert und jetzt bin ich aus Ideen.
Die einzige Lösung, die ich denken kann ist die Schaffung separate, nahezu identische Klassen für Elemente, wo diese Eigenschaft beschreibbar ist und ein für die schreibgeschützt, aber dies scheint ein wenig unelegant zu mir.
Hilfe? :)
Lösung
Was ich tun würde, ist eine Basisklasse mit einer geschützten Version der Eigenschaft erstellen, dann zwei Klassen erstellen, die die Basisklasse erben, die nur lesbar und die Nicht-Nur-Lese-Bits haben.
Andere Tipps
Sie können eine dynamische Informationen über die Eigenschaften einer Klasse auf eine Eigenschaft Raster von ICustomTypeDescriptor .
Das Objekt Grid rufen ICustomTypeDescriptor.GetProperties () und Sie geben eine Sammlung von Objekten, die von propertyDescriptors . In Ihrer Implementierung können Sie die PropertyDescriptor.IsReadOnly Eigenschaft und implementieren Ihre Logik.
Das ist ziemlich viel Arbeit in erster Linie, aber es gibt Ihnen die Möglichkeit, dynamisch einen Eigenschaftsnamen und eine Beschreibung (hilfreich für die Lokalisierung) zurückzukehren, dynamisch markieren Eigenschaften als schreibgeschützt, dynamiclly ein- und ausblenden Eigenschaften und machen viele andere nützliche Dinge.
Sie könnten etwas in diese Richtung versuchen, die Typumwandlung mit mehreren beteiligten Klassen zu vermeiden:
class TestClass
{
private bool isMyPropertyReadOnly;
public bool IsMyPropertyReadOnly
{
get { return isMyPropertyReadOnly; }
set { isMyPropertyReadOnly = value; }
}
private int myVar;
public int MyProperty
{
get { return myVar; }
set
{
if (isMyPropertyReadOnly)
{
throw new System.Exception("The MyProperty property is read-only.");
}
else
{
myVar = value;
}
}
}
}