为 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);
我想创建一个 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);