对象的子对象在传入参数时为空
本文关键字:对象 参数 | 更新日期: 2023-09-27 18:03:01
我有以下对象结构:
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
对象给我的控制器动作方法。在我的动作方法中,我调用助手方法并将Apple
作为参数传递:
my helper method:
public void doSomething(Fruit fruit) {
//do something with *fruit.Facts*
}
问题是,我的水果对象正在传递,但里面的事实对象返回为空。它在控制器中不是空的,但当我把它传递给这个助手方法时它是空的。我不明白为什么
这是否与控制器将对象作为参数传递给其他方法或其他东西有关?我知道在某些情况下你不能把控制器动作方法作为参数传递给对象。这有什么联系吗?
问题是您有两个完全独立的属性,称为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
}
}
一个对象,两个名字…这取决于你如何"查看"对象。
去掉Apple
和Orange
中Facts
属性的声明