为 xml-序列化生成代码

generate code for xml-serialization

我想创建一个 class 进行序列化。但是,我希望 Order 属性明确设置在我的 class 中的每个成员上。所以我写了这段代码:

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; }
}

解决方法很简单。我将该过程与自动添加的 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);