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 (like FontStyle) 有问题,则可以像访问类型static上的字段一样获取它的值enum

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