Как пометить свойство как ReadOnly, даже если GetCreateInstanceSupported = true в winforms, .net
Используя метод CreateInstance класса TypeConverter, можно редактировать свойства неизменяемого объекта, например шрифта.
Однако, в отличие от класса шрифтов, в моем классе есть некоторые свойства, которые я хотел бы просматривать, но только для чтения - даже если поддерживается CreateInstance.
Есть ли атрибут, который поддерживает это?
ЭТА: Я ответил на вопрос ниже. Тем не менее, есть место для небольшого улучшения, если у кого-то есть идеи.
2 ответа
Чтобы сделать свойство доступным только для чтения, наследуйте преобразователь типов и переопределите метод 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()> _
Если вы это сделаете, то существующий редактор все равно будет выбран.
TypeConverter.CreateInstance() не изменяет свойства, скажем, класса Font. Это просто создает новый экземпляр этого. Здесь нет никакой магии, он просто использует конструктор класса.
Просто опустите установщик свойств, все будет в порядке.
Если вы не хотите, чтобы кто-либо использовал Reflection для добавления ваших личных полей, вам нужно использовать атрибут [ReflectionPermission].