Designer が VS2010 で行う方法と同様に、オブジェクトをコード単位でコンストラクターに逆変換しようとしています。
例: Font オブジェクトのプロパティ
- 名前:Microsoft Sans Serif
- サイズ:9.75
- 単位:ポイント
- 太字:偽
- GdiCharSet:0
- GdiVerticalFont:False
- 斜体:偽
- 取り消し:False
- 下線:偽
フォーム デザイナで以下を生成します...
Me.Label1.Font = New System.Drawing.Font("Microsoft Sans Serif", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
実行時に有効な既存のフォント オブジェクトを持つこと。
dim f as font = <new font code>
どのクラスでも自動化されているように、クラスに関する特定の知識がなくても、そのコンストラクター コード行を取得するにはどうすればよいでしょうか。
とにかく、VSデザイナーはどのようにそれを行いますか?
編集:
コメントから「CodeDomSerializer」を確認した後、これを思いつきましたが、これを行うより良い方法はありますか??
Dim f As New Font("MS Sans Serif", 7.25!, FontStyle.Regular, GraphicsUnit.Point, 0, False)
'Dim f As New Font("MS Sans Serif", 7.25!, 1 + 2 + 4, GraphicsUnit.Point, 0, False)
'Dim f As New Point(55, 34)
Dim dsm As New DesignerSerializationManager
dsm.PreserveNames = True
dsm.RecycleInstances = False
dsm.PropertyProvider = f
dsm.CreateSession()
Dim cds As CodeDomSerializer = dsm.GetSerializer(dsm.PropertyProvider.GetType, GetType(CodeDomSerializer))
Dim coce As CodeObjectCreateExpression = cds.Serialize(dsm, dsm.PropertyProvider)
Dim tw As New StringWriter
Dim vbcp As New VBCodeProvider
vbcp.GenerateCodeFromExpression(coce, tw, Nothing)
Console.WriteLine(tw.ToString)
vbcp.Dispose()
tw.Dispose()
'coce
'cds
'dsm
f.Dispose()
この行を生成...
New System.Drawing.Font("Microsoft Sans Serif", 7.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0,Byte))
他のシリアル化されたコンストラクターでも機能するようです。