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;
}