我有以下对象结构:
class Facts {
string name;
string color;
//other stuff
}
class Fruit {
Facts Facts {get; set;}
}
class Apple : Fruit {
Facts Facts {get; set;}
}
class Orange : Fruit {
Facts Facts {get; set;}
}
现在,这是一个ASP.NET MVC应用程序,因此我将Apple
对象发送回我的控制器操作方法。在我的action方法中,我正在调用一个帮助器方法并将Apple
作为参数传递:
我的助手方法:
public void doSomething(Fruit fruit) {
//do something with *fruit.Facts*
}
问题是,我的水果对象正在传递,但内部的Facts对象返回null。它在控制器中不是空的,但是当我将它传递给这个辅助方法时它的空...我不明白为什么?
这是否与控制器将对象作为参数或其他方法传递给其他方法有关?我知道在某些情况下,您无法将对象作为参数传递给控制器操作方法。这有什么关系吗?
答案 0 :(得分:3)
问题在于,您为Facts
提供了两个名为Apple
的完全独立的属性。这是一个非常糟糕的主意 - 它让这种事情变得非常混乱。根据您正在使用的表达式的编译时类型,编译器正在使用它可以访问的任何一个。
你应该已经收到警告了 - 不要忽视警告!这是一个简短而完整的程序,用于说明问题所在:
using System;
class Fruit
{
public string Name { get; set; }
}
class Apple : Fruit
{
public string Name { get; set; }
}
class Test
{
static void Main()
{
var apple = new Apple { Name = "AppleName" };
Fruit fruit = apple;
Console.WriteLine(fruit.Name); // Nothing!
fruit.Name = "FruitName";
Console.WriteLine(((Fruit) apple).Name); // FruitName
Console.WriteLine(((Apple) fruit).Name); // AppleName
}
}
一个对象,两个名字......取决于你如何看待"对象。
只需摆脱Facts
和Apple
中Orange
属性的声明。