修改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
;添加/删除属性、属性等
然而,检查codeType
的Members
属性表明还没有定义默认构造函数。当然我可以加一个;但是当我写出代码字符串(使用CSharpCodeProvider.GenerateCodeFromNamespace
)时,另一个默认构造函数被添加到输出中(在本例中,用于在从模式派生的字段上设置一些默认值)。
我想做的基本上是在默认构造函数(我可以成功地添加到codeType
的方法)中插入对方法的调用。
(如何)我可以处理这样一个事实,当我写出的代码字符串,一个默认构造函数(不存在于Members
集合之前)被插入?
好吧,我觉得有点傻…
在调试过程中,我把自己弄糊涂了——看着一个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);