1

我编写了一些代码来从来自我们的 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属性codeType表明尚未定义默认构造函数。当然我可以加一个;但是当我去写出代码字符串时(使用CSharpCodeProvider.GenerateCodeFromNamespace),另一个默认构造函数被添加到输出中(在这种情况下,用于在从模式派生的字段上设置一些默认值)。

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

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

4

1 回答 1

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);
于 2013-04-04T04:41:22.737 回答