2016-07-25 48 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://計算器。 com/a/602404/3796048) –

+0

@MohitShrivastava不是真的,我希望使用'XmlOverrides'將屬性添加到創建的類本身,而不是添加到序列化程序。但據我從Marcs Post瞭解,我不能*修改*現有*類的任何屬性。但是,在我的課上,這個類目前還不存在,它在運行時自動生成。 – HimBromBeere

回答

0

解決的辦法很簡單。我將這個過程與XmlElement-自動添加並注意到的屬性進行了比較,屬性名稱不是XmlElementAttribute,而是System.Xml.Serialization.XmlElementAttribute。此外 - 正如Order -parameter是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);