Frage

Gibt es eine Möglichkeit, Folgendes zu tun?ICH sehen dass die Attributargumente ein konstanter Ausdruck sein müssen. Wie würde ich das umgehen?Wenn ich nicht laden möchte manche Eigenschaften mithilfe der Bindung in eine Datagrid-Ansicht integrieren. Was ist die nächstbeste Alternative?

  class TestObj
  {
     private bool isBrowsable = false;

     [Browsable(isBrowsable)]
     public string String1
     {
        get
        {
           return "Foo";
        }
     }
     [Browsable(isBrowsable)]
     public string String2
     {
        get
        {
           return "Baz";
        }
     }
  }
War es hilfreich?

Lösung

Sie können die dynamischen Informationen benutzerdefinierten Typ zur Laufzeit zur Verfügung stellen, indem Sie die ICustomTypeDescriptor Schnittstelle -. aber das ist ziemlich viel Arbeit bei weitem nicht so einfach, wie die Dekoration Eigenschaften mit Attributen

Andere Tipps

Für Laufzeit, denke ich, dass Sie wahrscheinlich bei ICustomTypeDescriptor suchen. Wenn es sich um eine Kompilierung Entscheidung waren, haben Sie Compiler-Direktiven verwendet könnte:


 #define ISBROWSABLE
 #if ISBROWSABLE
 [your attribute]
 #endif

Mit einem ähnlichen Ansatz können Sie Werte aus einer Konfigurationsdatei oder Datenbank ladenSo legen Sie einen dynamischen Wert in meinem Attribut fest durch Übergabe von Klassen- und Eigenschaftsnamen, z.B.

[IsBrowsable("classname", "propertyname")]

Es wird jedoch lästig sein, als Zeichenfolgennamen einzugeben, die offensichtlich sind und irgendwie aus der Reflexion ermittelt werden sollten.Sie können IL Weaver-Tools wie PostSharp oder Fody ausprobieren. (Ich glaube, dass sie dazu in der Lage sind, habe aber derzeit kein Beispiel)☑

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top