2016-07-25 2 views
0

Я хочу создать класс для сериализации. Однако я хочу, чтобы атрибут Order был явно задан для каждого члена моего класса. Так что я написал этот код:сгенерировать код для xml-сериализации

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

Вы ищете [добавление атрибутов свойства объекта во время выполнения] (HTTP: // StackOverflow. com/a/602404/3796048) –

+0

@MohitShrivastava Не совсем, я хочу, чтобы атрибуты, добавленные в созданный класс, вместо этого к сериализатору, используя 'XmlOverrides'. Однако, насколько я понял из Marcs Post, я не могу * добавлять * или * изменять * любые атрибуты в * существующем * классе. Однако в моем классе класс пока не существует, он генерируется автоматически во время выполнения. – HimBromBeere

ответ

0

Решение очень простое. Я сравнил процесс с XmlElement-атрибутами, которые были автоматически добавлены и замечены, что имя атрибутов не XmlElementAttribute, а System.Xml.Serialization.XmlElementAttribute. Кроме того - как Order параметрическое является аргументом XmlElementAttribute -constructor мы должны добавить его в CodeAttributeArgument:

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

member.Item.CustomAttributes.Add(attr); 
Смежные вопросы