【问题标题】:Assign property values of an object in a CodeObjectCreateExpression在 CodeObjectCreateExpression 中分配对象的属性值
【发布时间】:2019-02-06 10:42:29
【问题描述】:

我需要使用 CodeDOM 创建一个像这样(见下文)的对象。

internal static readonly Dynamic class1 = new Dynamic
{
    VendorId = "VTS",
    Test = 10.33f

};

我所做的尝试必须在Dynamic(使用 CodeDOM 创建)类中创建一个构造函数(见下文),它将所有需要的值设置为参数。遗憾的是,在一切正常之后,代码使用Dynamic 类给出了一个错误,即它不能使用带参数的构造函数(因为它是ML.NET 的数据结构)

CodeConstructor constructor = new CodeConstructor();

constructor.Attributes = MemberAttributes.Public;

constructor.Parameters.Add(new CodeParameterDeclarationExpression(typeof(float), "test"));

CodeFieldReferenceExpression reference =
    new CodeFieldReferenceExpression(
        new CodeThisReferenceExpression(), "test");

constructor.Statements.Add(new CodeAssignStatement(reference, 
    new CodeArgumentReferenceExpression("test")));

targetClass.Members.Add(constructor);

如何使用 CodeDOM 为属性赋值而不需要构造函数中的参数?

【问题讨论】:

  • 这是一个对象初始化器,而不是构造器调用。这相当于让static 构造函数执行class1 = new Dynamic(); class1.VendorId = "VTS"; class1.Test = 10.33f。参数是不必要的,因为调用代码不可能使用它们——没有机会参数化静态初始化程序。究竟应该生成什么代码取决于您的上下文,但是生成对默认构造函数的调用然后是设置属性的代码将是一个开始。或者,直接在构造函数中设置属性(但值不能改变)。
  • @JeroenMostert 我将尝试直接在构造函数中设置属性。这些值仅用于运行测试,如果用户真的需要更改它们,我可以添加使用 CodeDOM 重新生成具有新值的类的函数。非常感谢你的想法。我会试一试,看看它是否适用于我的代码。

标签: c# .net-core codedom


【解决方案1】:

在 cmets 中 @JeroenMostert 的帮助下,我能够找到解决问题的方法,可以用作 ML.NET 的数据结构:

 CodeConstructor constructor = new CodeConstructor
        {
            Attributes = MemberAttributes.Public
        };


    foreach (var item in features)
        {
            CodeFieldReferenceExpression reference =
            new CodeFieldReferenceExpression(
                new CodeThisReferenceExpression(), item.Id);

            constructor.Statements.Add(new CodeAssignStatement(reference, new CodePrimitiveExpression(item.TestCase)));
        }

        targetClass.Members.Add(constructor);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 2014-07-15
    • 2016-10-05
    • 2018-11-03
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2015-07-31
    相关资源
    最近更新 更多