0 votes

Comment marquer une propriété comme ReadOnly même si GetCreateInstanceSupported = true in winforms, .net

En utilisant la méthode CreateInstance de la classe TypeConverter, il est possible de modifier les propriétés d'un objet immuable, tel qu'une police.

Cependant, contrairement à la classe de police, il y a certaines propriétés dans ma classe que je voudrais pouvoir parcourir mais en lecture seule - même si CreateInstance est supporté.

Existe-t-il un attribut qui prend en charge cette fonction ?

ETA : J'ai répondu à la question ci-dessous. Il est encore possible de l'améliorer légèrement, cependant, si quelqu'un a une idée.

1voto

Hans Passant Points 475940

TypeConverter.CreateInstance() fait no modifier les propriétés de la classe Font, par exemple. Elle crée simplement une nouvelle instance de cette classe. Il n'y a pas de magie ici, il utilise simplement le constructeur de la classe.

Il suffit d'omettre le paramètre de propriété, et tout ira bien.

Si vous voulez empêcher quiconque d'utiliser Reflection pour fouiller dans vos champs privés, vous devez utiliser l'attribut [ReflectionPermission].

0voto

Jules Points 1527

Pour rendre une propriété en lecture seule, héritez du convertisseur de type et surchargez la méthode CanConvertFrom. Par exemple :

Public Class ReadOnlyStringConverter
    Inherits StringConverter

    Public Overrides Function CanConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal sourceType As System.Type) As Boolean
        Return (sourceType IsNot GetType(String)) AndAlso MyBase.CanConvertFrom(context, sourceType)
    End Function

End Class

Le seul inconvénient est que le texte n'apparaît pas en lecture seule, alors on pourrait s'attendre à pouvoir le modifier.

S'il s'agit d'un cas unique, il est possible d'imbriquer la classe et de la rendre privée afin de ne pas encombrer votre intellisense.

Pour désactiver un éditeur, ajoutez l'attribut suivant :

<Editor(GetType(UITypeEditor), GetType(UITypeEditor))> _

Il ne suffit pas de l'ajouter :

<Editor()> _

Si vous le faites, l'éditeur existant sera quand même repris.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X