2012-06-11 45 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