gpt4 book ai didi

c# - 继承类的无效输出

转载 作者:数据小太阳 更新时间:2023-10-29 01:47:27 25 4
gpt4 key购买 nike

我有两个类(class)

[DataContract, KnownType(typeof(B))]
public class A
{
[DataMember]
public string prop1 { get; set; }
[DataMember]
public string prop2 { get; set; }
[DataMember]
public string prop3 { get; set; }
}

[DataContract]
public class B : A
{
[DataMember]
public string prop4 { get; set; }
}

和以下方法:

List<B> BList = new List<B>();
BList = new List<B>() { new B() { prop1 = "1", prop2 = "2", prop3 = "3", prop4 = "4" } };
List<A> AList = BList.Cast<A>().ToList();
DataContractSerializer ser = new DataContractSerializer(typeof(List<A>));
FileStream fs = new FileStream(@"C:\temp\AResult.xml", FileMode.Create);
using (fs)
{
ser.WriteObject(fs, AList);
}

将其写入输出的 XML 文件:

<ArrayOfProgram.A xmlns="http://schemas.datacontract.org/2004/07/foo" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Program.A i:type="Program.B">
<prop1>1</prop1>
<prop2>2</prop2>
<prop3>3</prop3>
<prop4>4</prop4>
</Program.A></ArrayOfProgram.A>

怎么 这怎么可能发生,prop4在结果之内,我怎样才能避免这种情况? prop4不属于 List<A>正在连载中。

最佳答案

发生这种情况是因为您在 AList 中存储了指向 B 对象实例的指针。当您执行“new B() { prop1 = "1", prop2 = "2", prop3 = "3", prop4 = "4"}"时,您创建了一个 B 对象实例。当序列化程序反射(reflect)存储在 AList 中的对象时,它会找到一个实际的 B 对象实例,因为你没有更改 B 对象实例,你只是将它存储在 AList 中。编译器允许你这样做,因为继承链允许它,但 B 对象实例没有改变,那么无论你将它存储在哪里,它都是一个 B 对象实例。

而不是做:

List<A> AList = BList.Cast<A>().ToList();

做:

List<A> AList = BList.Select(b => new A() 
{ prop1 = b.prop1, prop2 = b.prop2, prop3 = b.prop3 })
.ToList();

这将为 BList 中的每个 B 实例创建一个新的 A 实例

关于c# - 继承类的无效输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39613957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com