C# “将具体对象制作为类型”;“对象”;失去财产

C# “将具体对象制作为类型”;“对象”;失去财产,c#,C#,如果我有以下课程 Person { string FirstName {get;set;} string LastName {get;set;} } 在另一节课上,我做了以下几点 OtherClass { List<Person> personList = new List<Person(/*10 people in here*/); List<Object> personObjectList = new List<Object>(); fo

如果我有以下课程

Person {
 string FirstName {get;set;}
 string LastName {get;set;}
}
在另一节课上,我做了以下几点

OtherClass {
 List<Person> personList = new List<Person(/*10 people in here*/);
 List<Object> personObjectList = new List<Object>();
 foreach (Person p in personList) {
  personObjectList.Add(p);
 }
}
为什么无法识别此对象具有
FirstName
属性?我没有意识到更改对象的类型会使其失去属性


谢谢你

它没有失去它的属性;编译器只是不知道它们的存在。要获取属性,您需要将其强制转换回
人员

name = ((Person)personObjectList[0]).FirstName;


如果强制转换失败,第一个样式将引发异常。如果强制转换失败,第二种样式将返回
null
,因此如果这样做,您应该检查
null

它不会丢失其属性;编译器只是不知道它们的存在。要获取属性,您需要将其强制转换回
人员

name = ((Person)personObjectList[0]).FirstName;


如果强制转换失败,第一个样式将引发异常。如果强制转换失败,第二种样式将返回
null
,因此如果这样做,您应该检查
null

您有两个主要选择。按照我建议的顺序。。它们是:

为每个视图创建视图模型。这些是UI层中的对象,表示各个视图的特定数据。将域模型映射到控制器中的视图模型。在这方面,库喜欢并可以帮助您删除大量管道代码。只是要小心不要在映射中引入业务逻辑

这有两个主要好处:

  • 您的视图可以使用强类型视图模型,而不是到处强制转换
  • 您的视图模型和域模型可以独立发展
第二点非常重要。当您允许视图直接使用域模型时,您会陷入许多大陷阱。最大的问题是,您将开始在任何地方使用
Html.HiddenFor
)来在页面之间持久化数据,这很快就会成为您要处理的噩梦

此外,拥有独立的视图模型允许模型独立地发展。您的域模型可能具有与业务需求相关的属性,但您的视图模型可以包含纯粹与UI相关的属性。诸如UI级验证、聚合属性(例如视图模型中的
FullName
,而不是
FirstName
+
姓氏
)。灵活性真的很好

其次,与我上面所说的相反,您可以在视图顶部放置一个
@using
指令,以包含对象所在的名称空间。这允许您在视图中使用模型


我强烈建议你调查一下我给你的第一个选择。在以后的项目中,您会感觉更好。

您有两个主要选择。按照我建议的顺序。。它们是:

为每个视图创建视图模型。这些是UI层中的对象,表示各个视图的特定数据。将域模型映射到控制器中的视图模型。在这方面,库喜欢并可以帮助您删除大量管道代码。只是要小心不要在映射中引入业务逻辑

这有两个主要好处:

  • 您的视图可以使用强类型视图模型,而不是到处强制转换
  • 您的视图模型和域模型可以独立发展
第二点非常重要。当您允许视图直接使用域模型时,您会陷入许多大陷阱。最大的问题是,您将开始在任何地方使用
Html.HiddenFor
)来在页面之间持久化数据,这很快就会成为您要处理的噩梦

此外,拥有独立的视图模型允许模型独立地发展。您的域模型可能具有与业务需求相关的属性,但您的视图模型可以包含纯粹与UI相关的属性。诸如UI级验证、聚合属性(例如视图模型中的
FullName
,而不是
FirstName
+
姓氏
)。灵活性真的很好

其次,与我上面所说的相反,您可以在视图顶部放置一个
@using
指令,以包含对象所在的名称空间。这允许您在视图中使用模型


我强烈建议你调查一下我给你的第一个选择。在以后的项目中,您会感觉更好。

您应该将
对象
显式转换为
(personObjectList[0]作为人)。FirstName是一个MVC应用程序,我在控制器中部分转换,然后在视图中部分转换,问题是视图不知道模型。。。因此,视图不知道类型Person是否使用强类型视图?您可以使用
动态
而不是
对象
。。。还有可能是强类型的解决方案(但您需要提供关于哪些不起作用的更多详细信息)。您应该将
对象
显式转换为
(personObjectList[0]作为人)。FirstName是一个MVC应用程序,我在控制器中部分转换,然后在视图中部分转换,问题是视图不知道模型。。。因此,视图不知道类型Person是否使用强类型视图?您可以使用
动态
而不是
对象
。。。此外,可能还有强类型解决方案(但您需要提供有关哪些不起作用的更多详细信息)。无法强制转换,因为它在视图中,不知道模型,但我知道您在做什么saying@AbdulAhmad你有两个选择。首先,您可以在视图顶部使用指令弹出一个
,这样视图就知道这些模型了。否则,您可以引入一个“视图模型”实体,将您的域对象映射到特定于t的模型
var person = personObjectList[0] as Person;
if (person != null)
    name = person.FirstName;