生成xml-serialization的代码

时间:2016-07-25 09:50:16

标签: c# xml-serialization code-generation

我想创建一个要序列化的类。但是我想要在我班级中的每个成员上明确设置Order - 属性。所以我写了这段代码:

public void Process(CodeNamespace code, XmlSchema schema)
{
    var types = code.Types.Cast<CodeTypeDeclaration>().Where(x => !x.IsEnum);
    foreach (var type in types) 
    {
        foreach(var member in type.Members.Cast<CodeTypeMember>().Select((x, i) => new { Item = x, Order = i }))
        {
            member.Item.CustomAttributes.Add(new CodeAttributeDeclaration("XmlElementAttribute", ???);
        }
    }
}

我不知道如何将命名参数Order设置为有效值。我已经尝试了new[] { Order = member.Order },但显然这根本不起作用。

所以我想要的是创建这段代码的东西:

public class MyClass 
{
    [XmlElement("MyProp", Order = 0)]
    public int Prop1 { get; set; }
}

1 个答案:

答案 0 :(得分:0)

解决方案非常简单。我将流程与XmlElement - 自动添加和注意的属性进行了比较,属性名称不是XmlElementAttribute而是System.Xml.Serialization.XmlElementAttribute。此外 - 由于Order - 参数是XmlElementAttribute - 构造函数的参数,我们必须将其添加为CodeAttributeArgument

var attr = new CodeAttributeDeclaration("System.Xml.Serialization.XmlElementAttribute");
attr.Arguments.Add(new CodeAttributeArgument("Order", new CodePrimitiveExpression(member.Order)));

member.Item.CustomAttributes.Add(attr);