1

CodeDom を使用して System.Drawing.Font のインスタンスをインスタンス化しようとしていますが、特に FontFamily および FontStyle パラメーターに対して新しい型を作成する方法がわかりません。

次のコードを実行すると:

CodeExpression[] parms = new CodeExpression[3];

parms[0] = new CodePrimitiveExpression(((System.Drawing.Font)value).FontFamily.Name);
parms[1] = new CodePrimitiveExpression(((System.Drawing.Font)value).Size);
parms[2] = new CodePrimitiveExpression(((System.Drawing.Font)value).Style);

codeObjectCreateExpression = new CodeObjectCreateExpression("System.Drawing.Font", parms);

エラーが発生する

無効なプリミティブ タイプ: System.Drawing.FontStyle。CodeObjectCreateExpression の使用を検討してください。

読んでみると、タイプのインスタンスを作成するために使用する必要があることはわかっていますが、プリミティブ以外のものCodeObjectCreateExpressionをそれに割り当てる方法がわかりません。

4

1 に答える 1

3

オブジェクトを使用したい場合は、それを行うことはできません(少なくとも、シリアル化などのハックを使用したり、リフレクションを使用してプライベートフィールドにアクセスしたりする必要があります)。これは、CodeDOMツリーをC#(または別の.Net言語)に変換する必要があるためです。そして、CodeDOMは、そのオブジェクトを構築するコードを作成する方法を知りません(コンストラクターを呼び出す必要がありますか?それともファクトリメソッドですか?または他の何か?)。

ただし、問題が発生しているのがenums(のような)の場合は、次のタイプのフィールドにFontStyleアクセスしているかのようにその値を取得できます。staticenum

new CodeFieldReferenceExpression(
    new CodeTypeReferenceExpression("System.Drawing.FontStyle"),
    ((System.Drawing.Font)value).Style.ToString())
于 2012-06-11T13:44:09.533 に答える