0

对于当前项目,我正在尝试XML使用XmlSerializer该类创建一个通用创建者-我需要其中一个类中的某个元素来ElementName根据创建者在此上下文中所处的类的类型来设置集合,这很简单。这是一个例子:

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

然后将其传递给我的XML对象类,该类将用于XmlSerializer但我希望ElementName特定于类型。

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

我以为我能做到这一点,但得到:

属性参数必须是属性参数类型的常量表达式、typeof 表达式或数组创建表达式

所以我认为我可以override ToString(),但这不起作用,我正在考虑使用常量,但感觉很脏。还有其他建议吗?

4

1 回答 1

0

您可以通过XmlAttributeOverrides如下所示的课程来做到这一点。但是,您需要缓存XmlSerializer实例,对于您的问题,我不推荐这种方法。

当你说你有一个元素对于每个继承的对象都不同时,我建议把这个元素放在继承的类中,而不是通用的类中,然后硬编码它的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 回答