Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从派生类在视图中显示属性_C#_Model View Controller - Fatal编程技术网

C# 从派生类在视图中显示属性

C# 从派生类在视图中显示属性,c#,model-view-controller,C#,Model View Controller,我正试图了解继承和多态性,可能遇到了一个简单的问题 我得到了一个抽象基类和两个派生类。我创建了一个viewmodel,其中包含一个基类类型的列表,并将其传递给视图 我的问题是如何在视图中显示派生类的属性 模型 public abstract class Card { public string Name { get; set; } public int Manacost { get; set; } } public class Spell : Card { public

我正试图了解继承和多态性,可能遇到了一个简单的问题

我得到了一个抽象基类和两个派生类。我创建了一个viewmodel,其中包含一个基类类型的列表,并将其传递给视图

我的问题是如何在视图中显示派生类的属性

模型

public abstract class Card
{
    public string Name { get; set; }
    public int Manacost { get; set; }
}

public class Spell : Card
{
    public string Description { get; set; }
}

public class Minion: Card
{
    public int AttackPower { get; set; }
    public int Health { get; set; }
}
传递给视图的视图模型

public class DeckbuilderVM
{
    public List<Card> CardLibary { get; set; }
}
公共类DeckbuilderVM
{
公共列表卡片库{get;set;}
}
看法

@model.DeckbuilderVM
@foreach(Model.CardLibary中的var项)
{
//你能接受这些吗
名称:@item.Name

Manacost:@item.Manacost

//我不能接这些电话 附件:@item.AttackPower

健康:@item.Health

//如何访问派生类的属性? }
我看不出你如何做到你所要求的(不使用反射)。在OOP中使用基类类型而不是派生类型的要点是,您说的是您不想要特定于每个派生类型的东西。在您的示例中,继承仅用于重用实现,并且不存在多态性。当类没有
抽象
成员时,将其标记为
抽象
也是奇怪的(也是错误的)。
//如何访问派生类的属性?
=>您需要将它们强制转换到子类中才能使用它。或者至少需要子类的引用才能访问这些属性。@Peter如果您正在建模的真实word对象始终是特定类型的抽象,那么对于抽象类,我可以看到一个令人信服的例子。@NickBailey:嗯,这只是我的意见。我想加上“IMO”,但这个评论太老了。即使您从未打算实例化该类,我也不认为将其标记为抽象类有什么意义,但显然意见不一抽象的要点是不应该创建card的对象,而应该只创建派生类的对象。基本上,我只需要将所有对象放在一个列表中,这样无论它们来自哪个派生类,我都可以一次遍历所有对象。这是一种错误的思维方式吗?
@model.DeckbuilderVM

@foreach (var item in Model.CardLibary)
{
    //Can acces these
    <p>Name: @item.Name</p>
    <p>Manacost: @item.Manacost</p> 

    //Can't acces these
    <p>Attactpower: @item.AttackPower </p>
    <p>Health: @item.Health </p>

//How to acces property of the derived classes?
}