5

我有以下课程:

public class BaseContainer
{
   public BaseItem item {get; set;}
}

public class ExtendedContainer : BaseContainer
{
   new public ExtendedItem item {get; set;}
}

public class BaseItem{
   public string Name { get; set; }
}

public class ExtendedItem : BaseItem
{
   public string Surname { get; set; }
}

然后我有以下说明:

ExtendedItem ei = new ExtendedItem { Name = "MyName", Surname = "MySurname" };
ExtendedContainer ec = new ExtendedContainer { item = ei };
BaseContainer bc = ec;
string temp = bc.item.Name;  // bc.item is null, why?

为什么 bc.item 为空?这不应该是因为 ExtendedItem 是 BaseItem 的子类,但是当我运行代码时它为空。谁能帮我解决这个问题?

我这样做的原因是我正在使用 MVC3 并且我正在传递给属于类似结构的部分视图对象/模型,并且我通常只需要基类中的属性。

提前致谢。

更新

乔恩是对的,我正在访问不同的对象。我所做的修复它是使用构造函数将项目属性设置为同一个对象。像这样:

public class BaseContainer
{
    public BaseItem item {get; set;}
    public BaseContainer(BaseItem item)
    {
        this.item = item;
    }
}

public class ExtendedContainer : BaseContainer
{
    public ExtendedItem item {get; set;}

    public ExtendedContainer(ExtendedItem item) : base(item)
    {
        this.item = item;
    }
}

public class BaseItem{
    public string Name { get; set; }
}

public class ExtendedItem : BaseItem
{
    public string Surname { get; set; }
}

然后我只创建对象:

    ExtendedItem ei = new ExtendedItem { Name = "MyName", Surname = "MySurname" };
    ExtendedContainer ec = new ExtendedContainer(ei);
    BaseContainer bc = ec;
    string temp = bc.item.Name;

现在可以了

4

2 回答 2

3

您使用了 new 关键字,它隐藏了 BaseContainer 中的原始基本属性。

实例化 ExtendedContainer 时,是在子类上设置新属性,而不是在基类上设置原始属性。

只需从子类中删除该属性,一切都应该正常。

于 2012-06-05T15:05:33.527 回答
3

这里有两个完全独立的属性,可以存储不同的值。

您已ExtendedContainer.item在对象上设置了属性,但尚未设置BaseContainer.item属性。

想象一下这两个属性有完全不同的名称——你不会期望设置一个来改变另一个,对吗?就 CLR 而言,这两个属性的名称只是巧合。

于 2012-06-05T15:05:43.247 回答