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 或我的自定义 classes。 我想知道是否有办法处理属性的声明赋值,其类型不是基本类型,也不是示例中的数组或列表。

正确的方法取决于对象的实例化方式。 例如,在 System.Drawing.Color 的情况下,您可以使用静态方法实例化一个值

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

因此初始化将导致:

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

要构建这样的 expression\assignment 您必须指示代码构建器您要使用一种方法(而不是构造函数)并且该方法采用一个 int 参数(原始类型)。

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

虽然通常 classes 通过构造函数实例化对象,但在这些情况下,您必须为构建器指定类型和特定的参数列表。 例如,如果您构建了一个 2D 点 class,并且构造函数采用两个点 (X,Y),您可以这样写:

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

(在这种情况下,两个参数都是双精度或浮点数,所以我使用了 CodePrimitiveExpression。) 您可以根据您正在处理的 classes 概括最后一个示例。

您可以在此处查看文档:

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