修改CodeTypeDeclaration中的默认构造函数

时间:2013-04-04 01:40:21

标签: c# code-generation

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

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

CodeNamespace codeNamespace = new CodeNamespace("MyNamespace");

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

CodeTypeDeclaration codeType = codeNamespace.Types.First();

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

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

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

(如何)我可以处理这样一个事实:当我写出代码字符串时,默认构造函数(之前codeType集合中没有)插入?

1 个答案:

答案 0 :(得分: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);