C# 将属性重写为派生类上的其他类型

C# 将属性重写为派生类上的其他类型,c#,xml,deserialization,C#,Xml,Deserialization,我正试图找到一个解决办法,但我不确定这是否可能 比如说,我有一个基类 public class A { [XmlAttribute("Date")] public DateTime Date {get;set;} } 和派生类: public class B: A { [XmlAttribute("Date")] public new String StringDate {get;set;} } 我必须序列化Xml Xml上“Date”的值是String,实际上它不是

我正试图找到一个解决办法,但我不确定这是否可能

比如说,我有一个基类

public class A
{
   [XmlAttribute("Date")]
   public DateTime Date {get;set;}
}
和派生类:

public class B: A
{
   [XmlAttribute("Date")]
   public new String StringDate {get;set;}
}
我必须序列化Xml

Xml上“Date”的值是String,实际上它不是DateTime格式的字符串。但是我用“A”表示很多其他的东西,所以我不能仅仅把它改成字符串而不影响程序的其他部分。遗憾的是,这不是一个选择

因此,我的想法是创建一个派生类“B”,它继承“a”的所有内容并重写属性Date,以从反序列化中得到填充,然后将其格式化为DateTime

我读过关于虚拟或摘要的文章,但我不熟悉,也没有任何线索,如果这是一个解决方案,也许有人可以在第一步指导我

有人能帮我吗

编辑 XML:

B类:

public class VorgangOverride : UTILMD.Vorgang
{
    private string datestring;

    [XmlAttribute("Vertragsbeginn")]
    public new String Vertragsbeginn {
        get { return datestring; }
        set
        {
            base.Vertragsbeginn = DateUtil.StringToDate(value, EDIEnums.Vertragsbeginn);
            datestring = value;
        } 
    }
}
反序列化方法:

private static VorgangOverride Deserialize (XmlNode inVorgang)
{
    using (MemoryStream stm = new MemoryStream())
    {
        using (StreamWriter stw = new StreamWriter(stm))
        {
            stw.Write(inVorgang.OuterXml);
            stw.Flush();
            stm.Position = 0;

            XmlRootAttribute xRoot = new XmlRootAttribute { ElementName = "Vorgang", IsNullable = true };

            var serializer = new XmlSerializer(typeof(VorgangOverride), xRoot);

            VorgangOverride podItem = (VorgangOverride) serializer.Deserialize(stm);

            return podItem;
        }
    }
}
编辑: 解决使用

[XmlRoot("Vorgang")]
public class VorgangOverride
{
    public VorgangOverride()
    {

    }
    #region Public Properties

    public string datestring;

    [XmlElement("Vertragsbeginn")]
    public Vertragsbeginn VertragsbeginnAsString { get ; set ;}

    #endregion
}

public class Vertragsbeginn
{

    [XmlAttribute("Vertragsbeginn")]
    public String vertragsbeginn { get; set; }
}

您将无法使用其他类类型重写属性

原因是多态性。(更多信息:)

您可以将类B强制转换为类A。这意味着类B也必须具有类A所具有的所有属性和方法。但在您的例子中,类B将有一个字符串,而不是一个名为Date的日期。这根本不可能。

我找到了解决方案:

[DataContract(Name = "Vorgang")]
[KnownType(typeof(Vorgang))]
public class Vorgang
{
    [XmlIgnore]  // use XmlIgnore instead IgnoreDataMember
    public DateTime Vertragsbeginn { get; set; }
}

// this class map all elements from the xml that you show
[XmlRoot("Vorgang")]  // to map the Xml Vorgang as a VorgangOverride instance
public class VorgangOverride : Vorgang
{
    [XmlAttribute("Vorgang2")]  // to map the Vorgang attribute
    public string VorgangAttribute { get; set; }

    [XmlElement(ElementName = "Vertragsbeginn")]  // to map the Vertragsbeginn element
    public Vertragsbeginn VertragsbeginnElement
    {
        get { return _vertragsbeginn; }
        set
        {
            base.Vertragsbeginn = new DateTime();  // here I Assing the correct value to the DateTime property on Vorgan class.
            _vertragsbeginn = value;
        }
    }
    private Vertragsbeginn _vertragsbeginn;
}

// this class is used to map the Vertragsbeginn element
public class Vertragsbeginn
{
    [XmlAttribute("Vertragsbeginn")]  // to map the Vertragsbeginn attriubute on the Vertragsbeginn element
    public string VertragsbeginnAttribute { get; set; }
}
后来我说:

var string xmlContent =
@"<Vorgang Vorgang2=""HQHT8GTQ"">
<Vertragsbeginn Vertragsbeginn=""20140202"" />
</Vorgang>";
        var a = Deserialize<VorgangOverride>(xmlContent);
var字符串xmlContent=
@"
";
var a=反序列化(xmlContent);
这是反序列化的方法:

    // method used to deserialize an xml to object
    public static T Deserialize<T>(string xmlContent)
    {
        T result;
        var xmlSerializer = new XmlSerializer(typeof(T));
        using (TextReader textReader = new StringReader(xmlContent))
        {
            result = ((T)xmlSerializer.Deserialize(textReader));
        }
        return result;
    }
//用于将xml反序列化为对象的方法
公共静态T反序列化(字符串xmlContent)
{
T结果;
var xmlSerializer=新的xmlSerializer(typeof(T));
使用(TextReader TextReader=new StringReader(xmlContent))
{
结果=((T)xmlSerializer.Deserialize(textReader));
}
返回结果;
}

您可以重命名该属性吗?是的,我可以重命名它,但不会有任何区别,因为属性(问题的更新)在两个属性中是相同的,并在运行时引发异常=(您的意思是要将XML反序列化为“A”,但XML将属性DateTime作为字符串(并且没有DateTime格式)?Tareq,我想说的是,使用两种不同类型的相同名称的变量可能不是一个好主意,这会使您的逻辑变得非常混乱和麻烦。要么使它们是相同的类型,要么给它们两个不同的名称,这是正确的@Alexander。xml中包含date属性类似于“20140161022”的格式,它是一个字符串,但“a”上的属性是一个日期时间,因为我不能更改它,我只是想知道这个任务是否可以在派生类上执行。好吧,如果我使用泛型类型和虚拟属性,那么这是不可能的吗?在尝试重写之前,我要做的第一件事是编写一个接受字符串的setter。例如,setDate(string date)并将字符串转换为DateTime类,并在该方法中设置它序列化程序实际上使用setter来设置属性。不是这样,会引发一个异常,表示xmlAttribute已经在基类上,我应该为属性使用另一个名称或新名称空间。verfica de nuevo que copiaste Exactament el codigo que te puse,porque eso Functiona correctamente。(请注意A类的变化)是的,我可以忽略,因为他认为“字符串”不是一个有效的AllXsd值。穆斯林的Xml内容是一个很好的问题。好的。没有人会这样说我是一位编辑,我的回答是:你的问题是什么。
var string xmlContent =
@"<Vorgang Vorgang2=""HQHT8GTQ"">
<Vertragsbeginn Vertragsbeginn=""20140202"" />
</Vorgang>";
        var a = Deserialize<VorgangOverride>(xmlContent);
    // method used to deserialize an xml to object
    public static T Deserialize<T>(string xmlContent)
    {
        T result;
        var xmlSerializer = new XmlSerializer(typeof(T));
        using (TextReader textReader = new StringReader(xmlContent))
        {
            result = ((T)xmlSerializer.Deserialize(textReader));
        }
        return result;
    }