Attribut <DesignOnly> wirkungslos

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Hebbe.

    Attribut <DesignOnly> wirkungslos

    Guten Tag,

    dies ist mein erster Beitrag und ich bitte zunächst um Nachsicht, dass ich als reiner Hobbyprogrammierer leider einen professionellen Standard niemals erreichen kann.
    Nun zu meinen (wahrscheinlich trivialen) Problem:
    Ich habe eine Klasse erstellt, in der ich die VB-TextBox um einige Eigenschaften erweitern möchte. Das funktioniert ganz gut, die Eigenschaften werden auf der Eigenschaftsseite angezeigt und ich kann sie dort und auch zur Laufzeit setzen. Mit einer Eigenschaft möchte ich erreichen, dass sie nur zur Entwurfszeit, jedoch nicht zur Laufzeit geändert werden kann. Dazu habe ich unter anderem die Attribute <EditorBrowsable(EditorBrowsableState.Never) und <DesignOnly(vbTrue)> gesetzt. Die Auswirkung, dass nun die Property in der IntelliSense nicht mehr angezeigt wird, entspricht meinen Erwartungen. Anders allerdings beim zweiten Attribut. Die Eigenschaft lässt sich nach wie vor mit Objekt.Eigenschaft=Value setzen und auch der Debugger verzweigt in den Set-Zweig der Eigenschaft. Das dürfte nach meinem Verständnis aber nicht so sein oder bin ich total auf dem Holzweg?
    Als neues Mitglied möchte ich dem Forum meinen Respekt aussprechen und freue mich auf viele Antworten. ;)
    DesignOnly ist nur ein attribut welches Metainformationen mitliefert, es ändert nichts daran, wie der Code eigentlich funktioniert. Selbst EditorBrowsable kann nicht verhindern, dass die Variable benutzbar ist, denn auch dieses Attribut ist dem Compiler reichlich egal. Das Attribut wird nur verwendet um es in IntelliSense zu verstecken.

    ErfinderDesRades schrieb:

    Jedenfals auf keinen Fall kann ein Attribut aus einer DesignTime-ReadWrite-Property eine Runtime-Readonly Property machen.

    Stimmt nicht ganz, es gibt Eigenschaften, welche z.B. mittels des JitIntrinsic attributes vom Jitter stark bearbeitet werden. Aber das gilt nur für bestimmte vorgefertigte Typen und ansonsten passts....


    Wenn es wirklich so wichtig ist, dass die Variable nur zur Designzeit geändert werden kann, dann solltest du eher einen TypeDescriptionProvider implementieren, diesen auf eine Klasse anwenden und über diesen einen CustomTypeDescriptor zur Verfügung stellen, welcher einerseits die standard Properties zurückgibt(kann man MyBase.GetProperties verwenden) und andererseits eben die eigene "imaginäre" property mit einem selbst implementiertem PropertyDescriptor.
    Das ganze ist nicht ganz unkompliziert und ich finde es fraglich ob es den Aufwand auch wirklich wert ist.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Danke für die Antworten.
    Es leuchtet mir ein, dass durch das Attribut <DesignOnly> aus einer ReadWrite-Property nicht zur Laufzeit eine ReadOnly-Property werden kann. Wie jvbsl richtig vermerkt hat, ist das Setzen des Attributs dem Compiler natürlich völlig egal. Es ist mir überhaupt nicht wichtig, eine endgültige Lösung präsentiert zu bekommen, denn ich nutze mein Projekt nur selbst und habe keine Absicht meinen Code weiterzugeben.
    Andererseits mag es für den einen oder anderen Benutzer vielleicht doch von Interesse sein, eine Eigenschaft nur zur Entwurfszeit setzen zulassen. In meinem Projekt möchte ich zum Beispiel den Programmierer vor dem Erzeugen eines Textboxobjektes entscheiden lassen, ob er nur Zahlen oder beliebige Zeichen eintragen kann. Zur Laufzeit sollte diese Eigenschaft dann nicht mehr zu ändern sein. Mir kam der Gedanke, im Konstruktor die Eigenschaft in eine Private-Variable zu kopieren und während der Laufzeit dann damit zu arbeiten. Wäre das eine akzeptale Möglichkeit?
    Danke Hebbe.
    nee - geht nicht.
    Prinzipiell gilt: Was du im Designer zur Designzeit machen kannst, das kannste auch zur Laufzeit machen.

    Das einzige was du machen kannst ist, zu testen, ob die Property schon gesetzt ist, und dann eine Exception werfen, wenn ein bösewicht die Property ein 2. mal zuweisen will.
    Und der Test darf nur zur Laufzeit stattfinden - weil im Designer soll mans ja ändern können.

    Um Laufzeit/DEsignzeit rauszufinden verwende ich dieses:

    VB.NET-Quellcode

    1. Private Shared _IsInDesignMode As Boolean? = Nothing
    2. Private Shared _HostProcesses As New List(Of String)({"XDesProc", "devenv", "WDExpress"})
    3. Public Shared ReadOnly Property IsInDesignMode() As Boolean
    4. Get
    5. If Not _IsInDesignMode.HasValue Then
    6. _IsInDesignMode = _HostProcesses.Contains(Process.GetCurrentProcess().ProcessName)
    7. End If
    8. Return _IsInDesignMode.Value
    9. End Get
    10. End Property

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()