0

XML現在のプロジェクトでは、クラスを使用して一般的な作成者を作成しようとしています-作成者がこのコンテキストで使用しているクラスのタイプに基づいて、十分に単純なセットをXmlSerializer持つために、クラスの1つに特定の要素が必要です。ElementName次に例を示します。

  public abstract class ElementTypeBase
  {
    public abstract string ElementName { get; }
  }
  public class ElementTypeA : ElementTypeBase
  {
    public override string ElementName
    {
      get { return "ElementA"; }
    }
  }

次に、これをXMLオブジェクトクラスに渡します。このクラスは、に使用されますXmlSerializerElementName、タイプに固有のものにする必要があります。

  public class XMLObject<T> where T : ElementTypeBase
  {
    [XmlElement(Activator.CreateInstance<T>().ElementName)]
    public string SomeElement;
  }

私はそれができると思っていましたが、次のようになります。

属性の引数は、定数式、typeof式、または属性パラメーターtypeの配列作成式である必要があります。

だからできると思ったのですoverride ToString()が、うまくいかず、定数を使うことを考えていたのですが、汚い感じがします。他に何か提案はありますか?

4

1 に答える 1

0

XmlAttributeOverrides以下に示すようなクラスを通してそれを行うことができます。ただし、XmlSerializerインスタンスをキャッシュする必要があり、問題に対してこのアプローチをお勧めしません。

継承されたオブジェクトごとに異なる要素が1つあると言う場合は、この要素をジェネリッククラスではなく継承されたクラスに配置し、その要素をハードコーディングすることをお勧めしますXmlElement.ElementName

using System;
using System.Xml.Serialization;

public class Program
{
    static void Main(string[] args)
    {
        XmlSerializer serializer =
            new XmlSerializer(typeof(XMLObject<MyElement>),
                XMLObject<MyElement>.Overrides);
        serializer.Serialize(Console.Out,
            new XMLObject<MyElement>() { SomeElement = "value" });
        Console.ReadLine();
    }
}
public class XMLObject<T> where T : ElementTypeBase, new()
{
    public static XmlAttributeOverrides Overrides { get; private set; }
    static XMLObject()
    {
        Overrides = new XmlAttributeOverrides();
        Overrides.Add(typeof(XMLObject<T>), "SomeElement",
            new XmlAttributes
            {
                XmlElements =
                {
                    new XmlElementAttribute(new T().ElementName)
                }
            });
    }

    public string SomeElement { get; set; }
}
public abstract class ElementTypeBase
{
    public abstract string ElementName { get; }
}
public class MyElement : ElementTypeBase
{
    public override string ElementName
    {
        get { return "ElementA"; }
    }
}
于 2012-10-26T16:40:39.833 に答える