对象的子对象在传入参数时为空

本文关键字:对象 参数 | 更新日期: 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*
}

问题是,我的水果对象正在传递,但里面的事实对象返回为空。它在控制器中不是空的,但当我把它传递给这个助手方法时它是空的。我不明白为什么

这是否与控制器将对象作为参数传递给其他方法或其他东西有关?我知道在某些情况下你不能把控制器动作方法作为参数传递给对象。这有什么联系吗?

对象的子对象在传入参数时为空

问题是您有两个完全独立的属性,称为FactsApple。这是一个非常糟糕的想法——它让这种事情变得非常混乱。编译器根据你使用的表达式的编译时类型,使用它可以访问的任意一个。

您应该已经收到关于此的警告-不要忽视警告!下面是演示这个问题的一个简短但完整的程序:

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

一个对象,两个名字…这取决于你如何"查看"对象。

去掉AppleOrangeFacts属性的声明