在参数中传递时,对象的子对象为null

时间:2015-07-16 19:33:04

标签: c# asp.net asp.net-mvc

我有以下对象结构:

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。它在控制器中不是空的,但是当我将它传递给这个辅助方法时它的空...我不明白为什么?

这是否与控制器将对象作为参数或其他方法传递给其他方法有关?我知道在某些情况下,您无法将对象作为参数传递给控制器​​操作方法。这有什么关系吗?

1 个答案:

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

一个对象,两个名字......取决于你如何看待"对象。

只需摆脱FactsAppleOrange属性的声明。