実行時にオブジェクトプロパティに属性を追加できますか?
-
03-07-2019 - |
質問
たとえば、以下のプロパティ属性を削除または変更するか、新しい属性を追加します。可能ですか?
[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の投稿を参照してください。
編集更新
所属していません StackOverflow