【问题标题】:Modify default constructor in CodeTypeDeclaration修改 CodeTypeDeclaration 中的默认构造函数
【发布时间】:2013-04-04 12:41:22
【问题描述】:

我编写了一些代码来从来自我们的 CMS 的 XML 模式生成 .NET 类型。这进展顺利,并产生了我所期待的结果。

现在我想自定义生成类型的默认(无参数)构造函数。我有一些看起来像这样的代码:

CodeNamespace codeNamespace = new CodeNamespace("MyNamespace");

// import type mappings from schema
// export type mappings into codeNamespace

CodeTypeDeclaration codeType = codeNamespace.Types.First();

至此,我可以成功修改codeType;添加/删除属性、属性等。

但是,检查codeTypeMembers 属性表明尚未定义默认构造函数。当然我可以加一个;但是当我去写出代码字符串时(使用CSharpCodeProvider.GenerateCodeFromNamespace),another 默认构造函数被添加到输出中(在这种情况下,用于在从模式派生的字段上设置一些默认值)。

我要做的基本上是在默认构造函数中插入对方法的调用(我可以按照上面的方法成功添加到 codeType 的方法)。

(如何)我可以处理这样一个事实,即当我写出代码字符串时,会插入一个默认构造函数(之前在 Members 集合中不存在) ?

【问题讨论】:

    标签: c# code-generation


    【解决方案1】:

    嗯,我觉得有点傻……

    我在调试过程中感到困惑 - 正在查看一个 没有 定义默认构造函数的 codeType,并与生成的源代码进行比较,该类型确实 包含默认值构造函数。

    我能够使用类似于以下的代码来处理这两种情况:

    var ctor = codeType.Members
                       .Cast<CodeTypeMember>()
                       .SingleOrDefault(m => m.GetType() == typeof(CodeConstructor));
    if (ctor == null)
    {
        //codeType didn't define a default constructor, so create one
        ctor = new CodeConstructor() { Attributes = MemberAttributes.Public };
    }
    else
    {
        //codeType did define a default constructor, remove it before modifying
        codeType.Members.Remove(ctor);
    }
    
    //make some modifications to ctor
    
    //add ctor to the codeType
    codeType.Members.Add(ctor);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-23
      • 2023-03-20
      • 2012-11-12
      • 2012-06-30
      • 2013-06-08
      • 2015-06-26
      • 2010-10-30
      相关资源
      最近更新 更多