Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 泛型类中来自T的XML元素名称_C#_Xml_Generics_Inheritance - Fatal编程技术网

C# 泛型类中来自T的XML元素名称

C# 泛型类中来自T的XML元素名称,c#,xml,generics,inheritance,C#,Xml,Generics,Inheritance,对于当前的项目,我试图使用XmlSerializer类创建一个通用的XML创建者-我需要在其中一个类中的某个元素,以便根据创建者在此上下文中所处的类的类型来设置ElementName。以下是一个例子: public abstract class ElementTypeBase { public abstract string ElementName { get; } } public class ElementTypeA : ElementTypeBase {

对于当前的项目,我试图使用
XmlSerializer
类创建一个通用的
XML
创建者-我需要在其中一个类中的某个元素,以便根据创建者在此上下文中所处的类的类型来设置
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;
  }
公共类XMLObject,其中T:ElementTypeBase
{
[XmlElement(Activator.CreateInstance().ElementName)]
公共字符串元素;
}
我以为我能做到,但得到:

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


所以我想我可以
重写ToString()
,但这不起作用,我想使用常量,但感觉很脏。还有其他建议吗?

您可以通过如下所示的
XmlAttributeOverrides
类来实现。 但是,您需要缓存
XmlSerializer
实例,对于您的问题,我不推荐使用这种方法

当你说每个继承的对象有一个不同的元素时,我建议把这个元素放在继承的类中,而不是泛型类中,并硬编码它的
xmlement.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"; }
    }
}
使用系统;
使用System.Xml.Serialization;
公共课程
{
静态void Main(字符串[]参数)
{
XmlSerializer序列化程序=
新的XmlSerializer(typeof(XMLObject),
XMLObject.Overrides);
serializer.Serialize(Console.Out,
新的XMLObject(){SomeElement=“value”});
Console.ReadLine();
}
}
公共类XMLObject,其中T:ElementTypeBase,new()
{
公共静态XmlAttributeOverrides重写{get;private set;}
静态XMLObject()
{
Overrides=新的XmlAttributeOverrides();
Overrides.Add(typeof(XMLObject),“SomeElement”,
新的XML属性
{
XmlElements=
{
新的XmlElementAttribute(新的T().ElementName)
}
});
}
公共字符串SomeElement{get;set;}
}
公共抽象类ElementTypeBase
{
公共抽象字符串ElementName{get;}
}
公共类MyElement:ElementTypeBase
{
公共重写字符串ElementName
{
获取{return“ElementA”;}
}
}

这听起来很奇怪。如果XML结构是动态的,为什么要使用
XmlSerializer
注释?@millimoose这是整个结构中的一个元素,它需要是动态的。我可以为每个不同类型创建一个类,但要尽可能使其通用。编辑:我的意思是,对于这个XML,结构不需要是动态的,但是对于一个elemenet,它确实需要是动态的,因为单个元素可以有不同的属性,并且显然需要不同的元素名——其余的保持不变(不知道我对此的解释如何……)文档中提到您可以重写来定制XML序列化,在
ElementTypeBase
上这样做似乎是实现所需的最简单的方法。通过向我介绍XmlAttributeOverrides,您让我了解了一半,结果证明它没有我的示例那么复杂,但无论如何,谢谢。对,正如我在回答中所概述的,即使它是可行的,您的问题更多地指向了设计缺陷,而不是技术问题。很高兴你自己买的。