【问题标题】:System.CodeDom set InitExpression of a CodeMemberFieldSystem.CodeDom 设置 CodeMemberField 的 InitExpression
【发布时间】:2020-07-31 17:18:37
【问题描述】:

我正在使用 CodeDom 创建一个类文件 (.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 或我的自定义类。 我想知道是否有办法处理类型不是基本类型的属性的声明分配,也不是示例中的数组或列表。

【问题讨论】:

    标签: c# roslyn codedom


    【解决方案1】:

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

    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()) });
    

    通常,类通过构造函数实例化对象,在这种情况下,您必须为构造函数指定类型和特定的参数列表。 例如,如果您构建了一个 2D Point 类,其构造函数采用两个点 (X,Y),您可以编写:

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

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

    您可以在此处查看文档:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      相关资源
      最近更新 更多