質問

たとえば、以下のプロパティ属性を削除または変更するか、新しい属性を追加します。可能ですか?

[XmlElement("bill_info")]
[XmlIgnore]
public BillInfo BillInfo
{
  get { return billInfo; }
  set { billInfo = value; }
}
役に立ちましたか?

解決

(編集-元の質問を読み違えた)

実際の属性を追加することはできません(それらはILに書き込まれます)。ただし、 XmlSerializer を使用する必要はありません-コンストラクターで追加の属性を XmlSerializer に提供できます。ただし、これを行う場合は XmlSerializer インスタンスをキャッシュするために少し注意する必要があります。そうしないと、インスタンスごとに追加のアセンブリが作成されるため、少し漏れが生じます。 ( Type を受け取る単純なコンストラクターを使用する場合、これは行いません)。 XmlAttributeOverrides

例:

using System;
using System.Xml.Serialization;
 public class Person
{
    static void Main()
    {
        XmlAttributeOverrides overrides = new XmlAttributeOverrides();
        XmlAttributes attribs = new XmlAttributes();
        attribs.XmlIgnore = false;
        attribs.XmlElements.Add(new XmlElementAttribute("personName"));
        overrides.Add(typeof(Person), "Name", attribs);

        XmlSerializer ser = new XmlSerializer(typeof(Person), overrides);
        Person person = new Person();
        person.Name = "Marc";
        ser.Serialize(Console.Out, person);
    }
    private string name;
    [XmlElement("name")]
    [XmlIgnore]
    public string Name { get { return name; } set { name = value; } }
}

注: xml属性が単なる例である場合、 TypeDescriptor.CreateProperty ICustomTypeDescriptorを使用して、データバインディングに関連するものの属性を追加する second の方法があります。 または TypeDescriptionProvider 。 xmlの場合よりもはるかに複雑で、すべてのコードで機能するわけではなく、component-modelを使用するコードだけが怖いです。

他のヒント

実行時にクラスの属性を追加/削除することはできません。

ただし、属性を編集する必要なく、実行時にXMLシリアル化が機能する方法を更新できます。 Marcの投稿を参照してください。

編集更新

scroll top