簡體   English   中英

System.CodeDom 設置 CodeMemberField 的 InitExpression

[英]System.CodeDom set InitExpression of a CodeMemberField

我正在使用 CodeDom 創建一個 class 文件(.cs):

CodeTypeDeclaration myClass = new CodeTypeDeclaration("MyClass");
myClass .TypeAttributes = TypeAttributes.Public;

CodeMemberField field = new CodeMemberField();
field.Name = "Attribute_1"
field.Type = new CodeTypeReference(***);
field.InitExpression = ???

我正在創建不同類型的不同屬性,例如 System.Drawing.Color 或我的自定義類。 我想知道是否有辦法處理類型不是基本類型的屬性的聲明分配,也不是示例中的數組或列表。

正確的方法取決於 object 的實例化方式。 例如,在 System.Drawing.Color 的情況下,您可以使用 static 方法實例化一個值

public static System.Drawing.Color FromArgb (int argb);

因此初始化將導致:

private System.Drawing.Color Attribute_1 = System.Drawing.Color.FromArgb(-1);

要構建這樣的表達式\賦值,您必須指示代碼構建器您要使用一種方法(而不是構造函數)並且該方法采用一個 int 參數(原始類型)。

field.InitExpression = new CodeMethodInvokeExpression(
    new CodeMethodReferenceExpression(new CodeTypeReferenceExpression(field.Type), "System.Drawing.Color.FromArgb"),
    new CodeExpression[] { new CodePrimitiveExpression(initialValue.ToArgb()) });

通常,類通過構造函數實例化對象,在這些情況下,您必須向構建器指定 arguments 的類型和特定列表。 例如,如果您構建了一個 2D 點 class,其構造函數采用兩個點 (X,Y),您可以編寫:

field.InitExpression = new CodeObjectCreateExpression(field.Type,
    new CodeExpression[] { 
        new CodePrimitiveExpression(initialValue.X),
        new CodePrimitiveExpression(initialValue.Y)
});
                

(在這種情況下,arguments 都是雙精度或浮點數,所以我使用了 CodePrimitiveExpression。)您可以根據您正在處理的類來概括最后一個示例。

您可以在此處查看文檔:

https: //docs.microsoft.com/en-us/dotnet/api/system.codedom.codemethodinvokeexpression https: //docs.microsoft.com/en-us/dotnet/api/system.codedom.codeobjectcreateexpression

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM