修改CodeTypeDeclaration中的默认构造函数

本文关键字:默认 构造函数 CodeTypeDeclaration 修改 | 更新日期: 2023-09-27 18:07:30

我编写了一些代码,从来自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)时,另一个默认构造函数被添加到输出中(在本例中,用于在从模式派生的字段上设置一些默认值)。

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

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

修改CodeTypeDeclaration中的默认构造函数

好吧,我觉得有点傻…

在调试过程中,我把自己弄糊涂了——看着一个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);