我怎么能知道演员阵容<>说得通?

时间:2015-10-16 20:03:25

标签: c# casting

对于下面的代码段,可能不需要向能够回答我问题的人解释:

protected readonly List<TEntity> Records; //Within the class declared.

protected virtual void ReadFile()
{
  //So the file exists, is not null and not whitespace only
  var serializer = new XmlSerializer(Records.GetType());
  using (var reader = new StringReader(contents))
  {
    var records = (List<TEntity>)serializer.Deserialize(reader);
    Records.Clear();
    Records.AddRange(records);
  }
}

关于这一行:

var records = (List<TEntity>)serializer.Deserialize(reader);

(1)我怎么知道(推断)这个演员阵容是可能的?我查看Deserialize()方法返回类型“object”。所以这不是暗示。 (编辑:我的意思是在编码/设计时间。之后没有为了试验和错误而编译。所以想想目标明确:目标=将xml数据存储到列表中&lt;&gt;。是否可以通过简单的演员(是的)以及如何我事先知道了吗?) (2)我怎么能/我可以推断出(d)变量“记录”最终会如何? 例如,什么不应该让我认为只有一个条目写入列表并且单个索引包含所有XML内容? (而不是在将其写入列表时保持良好的结构)

我的问题的最终目标是了解何时需要此类演员以及尤其 实际演员的理解方式。我愿意通过练习和实验来努力。但我不知道怎么想。

a)我是初学者,虽然快速学习i.m.o. b)我已阅读并理解隐式/显式转换并理解它基于范围而不是数据大小。但是这些教程限制内置基本类型,如int,float,decimal(你可以命名)。现在这个问题域(转换)我想移到更高的层次。

4 个答案:

答案 0 :(得分:3)

演员

 var records = (List<TEntity>)serializer.Deserialize(reader);

而起作用
 new XmlSerializer(Records.GetType());

从对象到任何东西的强制转换将始终编译,但在类型不匹配时会产生运行时异常。

序列化程序从其构造函数中了解根类型,并将创建该类型的结果。如果XML与之不匹配,则会引发错误。您不能使用此反序列化单个TEntity,只能使用List&lt;&gt;有0个或更多元素。

您可以轻松验证:

object temp = serializer.Deserialize(reader);
// print or inspect temp.GetType() here
var records = (List<TEntity>)temp;

请注意,如果将XmlSerialzier设计为泛型类型,则不需要强制转换:

var serializer = new XmlSerializerGeneric<List<TEntity>>();
var records = serializer.Deserialize(reader);

但事实并非如此,它通过System.Object类使用旧的“动态类型”方式。

答案 1 :(得分:1)

如果不是这个,那将是非常明显的

var serializer = new XmlSerializer(Records.GetType());
你用过这个

var serializer = new XmlSerializer(typeof(List<TEntity>));

规则很简单。您传递给XmlSerializer构造函数的类型,您可以安全地将Deserialize结果转换为类型

需要强制转换,因为XmlSerializer(以及Enum和许多其他框架类)在添加泛型之前的很长一段时间内都存在,因此返回object是唯一的它的选择。由于向后兼容性(不破坏你编写的现有代码),它必须保持这种方式。

答案 2 :(得分:0)

  

我怎么能知道(推断)这种演员是否可能?

一种方法是使用调试器。在设置Records.Clear();之后,在records行上设置断点。然后在Watch窗口或Locals窗口中,查看records变量的类型。它可能会这样说:

object { List<TEntity> }

recordsList<TEntity>,但它作为对象传递,因为对serializer.Deserialize(reader)的调用会返回一个对象。如果您没有声明从对象到List<TEntity>的隐式转换,则必须使用显式转换。

除了最明显的情况外,我建议不要进行隐式转换。

答案 3 :(得分:0)

  

(1)我怎么知道(推断)这个演员阵容是可能的?

一切都从这里开始,

protected readonly List<TEntity> Records;

您不必推断,但您已经知道您正在从具有某种XML结构的文件中读取文件内容,并且由于您使用的是您之前知道的列表,因此将会有多个列表项

  

我查看了Deserialize()方法返回的类型   “宾语”。所以这不是暗示。

对象类不是直接使用的(所以基本上这是一个必须要强制转换的提示)并且必须先将其转换为某种类型(在本例中为List<TEntity>)才能使用它。

  

(2)我怎么能/我可以推断出(d)变量“记录”将如何结束   吗?

假设我想创建人员列表,我知道我会保留一些结构,例如,

我有以下XML

<persons>
<person>
<name>Chuck Norris</name>
<age>137</age>
</person>
<person>
<name>Donald Trump</name>
<age>19</age>
</person>
<persons>

您知道您希望获得您的列表将被声明为此人的记录,List<Person>。您知道Deserialize()方法返回对象,您希望读取人员数据,您可以将该对象转换为List<Person>。基本上我要说的是,你提出的问题都是基于你在申请设计时做出的假设和选择。