TypeConverter クラスの CreateInstance メソッドを使用すると、フォントなどの不変オブジェクトのプロパティを編集できます。
ただし、フォント クラスとは異なり、私のクラスには、CreateInstance がサポートされていても、参照可能で読み取り専用にしたいプロパティがいくつかあります。
これをサポートする属性はありますか?
ETA: 以下の質問に回答しました。ただし、誰かにアイデアがあれば、まだわずかな改善の余地があります。
TypeConverter クラスの CreateInstance メソッドを使用すると、フォントなどの不変オブジェクトのプロパティを編集できます。
ただし、フォント クラスとは異なり、私のクラスには、CreateInstance がサポートされていても、参照可能で読み取り専用にしたいプロパティがいくつかあります。
これをサポートする属性はありますか?
ETA: 以下の質問に回答しました。ただし、誰かにアイデアがあれば、まだわずかな改善の余地があります。
TypeConverter.CreateInstance() は、たとえば Font クラスのプロパティを変更しません。その新しいインスタンスを作成するだけです。ここに魔法はありません。クラス コンストラクターを使用するだけです。
プロパティ セッターを省略するだけで問題ありません。
だれかが Reflection を使用してプライベート フィールドを突くのを防ぎたい場合は、[ReflectionPermission] 属性を使用する必要があります。
プロパティを読み取り専用にするには、型コンバーターを継承し、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
唯一の欠点は、テキストが読み取り専用に見えないことです。そのため、編集できることを期待するかもしれません。
1回限りの場合は、クラスをネストしてプライベートにして、インテリセンスが乱雑にならないようにしても問題ありません。
エディターを無効にするには、次の属性を追加します。
<Editor(GetType(UITypeEditor), GetType(UITypeEditor))> _
以下を追加するだけでは十分ではありません:
<Editor()> _
その場合、既存のエディターが引き続き選択されます。