Laden...

Browsable Attribut auf einem Interface Property

Erstellt von gelöschtem Konto vor 13 Jahren Letzter Beitrag vor 12 Jahren 2.380 Views
Gelöschter Account
vor 13 Jahren
Browsable Attribut auf einem Interface Property

Hallo,

Ich habe festgestellt das man das Browsable Attribut auf Interface Membern
wohl nicht verwenden kann. Bei folgendem Sample Code wird mir das Property
Visible beim Verwenden in einem anderen Assembly trotzdem angezeigt.


interface MyInterface
{
    [Browsable(false)]
    bool Visible { get; }
}

class MyClass : MyInterface
{
   [Browsable(false)]
   public Visbible
   {
      get
     {
          return true; 
      }
   }
}

Mache ich was falsch ?

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo Sebastian.Lange,

du meinst wohl das EditorBrowsable-Attribut, oder? Laut MSDN ist das Browsable-Attribut auch auf Properties anwendbar - das ist aber nicht der Fall, wenn ich dich nicht falsch verstanden habe.

zero_x

Gelöschter Account
vor 13 Jahren

Ja ich vermute jetzt mal das ich das Property trotzdem sehe weil ich alle Projekte
innerhalb einer Solution zusammengefasst habe und sie über Projekreferenzen verbinde. Mit dem Interface hats vermutlich nix zu tun schulterzuck

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo Sebastian.Lange,

ich verstehe nicht, was du meinst. Beides sind unterschiedliche Attribute. Wenn du ein Property im IntelliSense verstecken möchtest, dann verwende das EditorBrowsable-Attribut. Wenn du eine Propertie im Property-Fenster verstecken möchtest, verwende das Browsable-Attribut.

zero_x

Gelöschter Account
vor 13 Jahren

Hmm okay dann nochmal anders.

Das EditorBrowsable Attribut funktioniert nicht innerhalb des gleichen Projekts bzw. einer Solution. Weisst nun was ich mein?

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Sebastian.Lange,

mal abgesehen davon, dass das EditorBrowsableAttribut sowieso nicht so ganz zur Objektorientierungen passt (Vererbung bedeutet Spezialisierung im Sinne von Erweiterung, nicht im Sinne von Einschränkung/Ausblenden, siehe Liskovsches Substitutionsprinzip), kommt es mir besonders fragwürdig vor, das EditorBrowsableAttribut auf eine Property eines Interfaces anzuwenden, weil ein Interface ja gerade definiert, was alle Klassen, die das Interface implementieren, zur Verfügung stellen müssen.

herbivore

Gelöschter Account
vor 13 Jahren

Hallo herbivore,

Also mein Szenario sieht so aus das ich eine Komponente MyLibrary.Core habe
die Klassen anbietet von der mehrere andere Komponten MyLibrary.A , MyLibrary.B Klassen ableiten. Diese Assemblies liefere ich so aus.
Entwickler die MyLibrary.A oder MyLibrary.B benutzen sollen durch die geerbten
Readonly Properties aus .Core im Intellisense nicht unnötig verwirrt werden da sie auf dieser Ebene nicht relevant sind. Ansonsten gebe ich dir recht.
Der Grund warum das Attribut nicht funktioniert ist das es wirkungslos
ist wenn man all Projekte inklusive Testanwendung innerhalb einer Solution hostet.
Mit dem Interface hat das nichts zu tun, das habe ich fehlgedeutet.
Das Attribute direkt in der Interface Definition ist Murks, das habe ich auch entfernt, in der konkreten Implementierung belasse ich es aber. Wenn du einen besseren Vorschlag für mich hast dann immer her damit 8)

Frohes neues Jahr
Sebastian

Gelöschter Account
vor 12 Jahren

Ich möchte diesen Thread nochmal aus der Versenkung holen da ich zwischenzeitlich über eine Lösung gestolpert bin die vermutlich nicht sonderlich bekannt ist. Ich habe das Assembly Mono.Cecil.dll untersucht und folgendes gefunden.

[assembly: InternalsVisibleTo("Mono.Cecil.Pdb, PublicKey=<Viele Zahlen>")]

Das InternalsVisibleTo Attribute macht es für ein Assembly möglich ausgewählte Komponenten bevorzugt zu behandeln, innerhalb einer Service Landschaft bzw. komplexeren Frameworks keine schlechte Sache auch wenn man aus dem Design Aspekt heraus argumentieren kann das eine API zur Kompilierzeit nicht nach unten in Richtung seiner Anwender verknüpft werden darf.

Festlegen des InternalsVisibleTo-Attributs