Как пометить свойство как ReadOnly, даже если GetCreateInstanceSupported = true в winforms, .net - PullRequest
0 голосов
/ 17 января 2010

Используя метод CreateInstance класса TypeConverter, можно редактировать свойства неизменяемого объекта, такого как шрифт.

Однако, в отличие от класса шрифтов, в моем классе есть некоторые свойства, которые я хотел бы просматривать, но только для чтения - даже если поддерживается CreateInstance.

Есть ли атрибут, который поддерживает это?

ETA: я ответил на вопрос ниже. Тем не менее, есть место для небольшого улучшения, если у кого-то есть какие-либо идеи.

Ответы [ 2 ]

1 голос
/ 17 января 2010

TypeConverter.CreateInstance () делает не изменения свойств, скажем, класса Font. Это просто создает новый экземпляр этого. Здесь нет никакой магии, он просто использует конструктор класса.

Просто опустите установщик свойств, все будет в порядке.

Если вы хотите запретить кому-либо использовать Reflection для добавления ваших личных полей, вам нужно использовать атрибут [ReflectionPermission].

0 голосов
/ 18 января 2010

Чтобы сделать свойство доступным только для чтения, наследуйте преобразователь типов и переопределите метод CanConvertFrom.Например:

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

Единственным недостатком является то, что текст не доступен только для чтения, поэтому можно ожидать, что его можно будет редактировать.

Если он отключен, онхорошо, чтобы вложить класс и сделать его закрытым, чтобы он не загромождал ваш разум.

Чтобы отключить редактор, добавьте следующий атрибут:

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

Недостаточно добавить:

<Editor()> _

Если вы это сделаете, то существующий редактор все равно будет выбран.

...