2012-06-11 47 views
1

我想使用CodeDom实例化System.Drawing.Font的一个实例,但我无法解决如何创建一个新类型,专门用于FontFamily和FontStyle参数。使用CodeDom实例化一个非原始类型

如果我执行下面的代码:

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创建类型的实例,但我不能确定如何分配anything apart from primitives它。

+0

我不明白你是什么遇到问题。 CodeObjectCreateExpression(Type,CodeExpression [])'重载看起来非常简单且不言自明。 – leppie

+0

@leppie我已经包含了一些代码,我希望这更有意义,我有一种感觉,我错过了一些明显的东西... – GrandMasterFlush

+0

你确定这是你实际使用的代码吗?因为您没有将'FontFamily'传递给代码中的'CodePrimitiveExpression'构造函数。 – svick

回答

3

如果你想使用任何对象,那么你不能这样做(至少不使用像序列化或使用反射私人字段的黑客)。这是因为CodeDOM树必须转换为C#(或另一种.Net语言)。而且CodeDOM不知道如何编写构建该对象的代码(它应该调用构造函数?哪一个?或者工厂方法?还是别的?)。

但是,如果它只是enum S(像FontStyle),你有问题,你可以,如果你是在enum类型访问static场得到其数值:

new CodeFieldReferenceExpression(
    new CodeTypeReferenceExpression("System.Drawing.FontStyle"), 
    ((System.Drawing.Font)value).Style.ToString()) 
+0

即将写类似(尽管我生锈的旧代码使用属性引用,而不是字段引用)。如果在枚举值中设置了多个标志(如果FontStyle是一个标志枚举...) –

+0

@Svick - 非常感谢您花时间回答,我明白我在哪里出错了以及我对CodeDom如何工作的看法。 – GrandMasterFlush

+0

@Damien_The_Unbeliever - 有趣的是你应该提到的是,我发现的例子有一个解决方法。在此URL查找方法EvalEnums():http://www.codeproject.com/script/Content/ViewAssociatedFile.aspx?rzp=%2FKB%2FXML%2Fxmlcompiler%2FxmlCompiler.zip&zep=Clifton.Tools.Xml%2FCodeGen。 cs&obid = 11629&obtid = 2&ovid = 1 – GrandMasterFlush