2014-10-06 46 views
0

,如果我有下面的类作出具体对象类型“对象”失去性能

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

然后我尝试做

personObjectList[0].FirstName; 

为什么不认识到此对象具有FirstName属性?我没有意识到改变对象的类型会使它失去它的属性。

谢谢

+1

你应该明确地将'Object'转换为'Person':'(personObjectList [0] as Person).FirstName' – IVAAAN123 2014-10-06 03:31:41

+0

嗯,它是一个MVC应用程序,我在控制器中部分地做了这个,然后部分地在视图中,问题是视图不知道模型...所以键入Person对视图是未知的 – 2014-10-06 03:32:51

+2

使用强类型视图? – 2014-10-06 03:35:02

回答

2

你有两个主要选择。按照我的建议,它们是:

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

这有两大好处:

  • 您的视图可以使用强类型的视图模型,而不是铸造到处
  • 您的视图模型和领域模型可以发展独立

这第二点是非常重要的。当你允许你的视图直接使用域模型时,你陷入了很多大陷阱。最大的问题是,你将开始使用Html.HiddenFor<input type="hidden"/>无处不在在页面之间保持数据 - 这非常快速地成为你处理的噩梦。

此外,具有独立的视图模型允许模型独立演变。您的域模型可能具有与业务需求相关的属性 - 但您的视图模型可以包含纯粹与UI关注相关的属性。像UI级别验证,聚合属性(例如视图模型中的FullName而不是FirstName + Surname)。灵活性真的非常好。其次,针对我上面所说的所有内容 - 只需在视图的顶部放置一个@using指令,以将对象所在的名称空间包括在内。这允许您在视图中使用模型。

..我强烈建议你调查我提供给你的第一个选项。你稍后在你的项目中会感觉更好。

+0

谢谢你的解释! – 2014-10-06 03:58:06

+1

没问题。我看到_many_项目由于域视图在视图中而变成了汤。很多时候我看到'@ Html.HiddenFor'被放入视图中以用于存储的特定目的......它烦人地处理调试时的问题,当然也是错误的做法。 – 2014-10-06 03:59:46

3

它不会失去它的属性;编译器只是不知道它们存在。要获得属性,您需要将其重新转换回Person。如果转换失败

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

var person = personObjectList[0] as Person; 
if (person != null) 
    name = person.FirstName; 

的第一个样式会抛出异常。如果演员失败,第二种风格将返回null,所以如果你这样做,你应该检查null

+0

没关系编辑它自己:) – 2014-10-06 03:36:27

+0

哎呀!谢谢:) – 2014-10-06 03:38:15

+0

无法投射,因为它在视图中,它不知道模型,但我看到你在说什么 – 2014-10-06 03:40:50