2

我有一个局部视图,我希望它能够与几个不同的模型一起使用。有什么方法可以找出作为父对象传入的对象的子类是什么?

例如:

模型:

public class Animal { }
public class Dog : Animal { }
public class Cat : Animal { }

控制器:

public class AnimalActionController : Controller
{
    public ActionResult MakeAnimalSound(Animal animal)
    {
       if (animal is Dog)
       {
         return PartialView("~/Views/_AnimalActionView.cshtml", new{sound="Woof"});
       }
       if (animal is Cat)
       {
         return PartialView("~/Views/_AnimalActionView.cshtml", new{sound="Meow"});
       }
    }
}

Dog 页面的父视图:

@model Test.Models.Dog
@Html.Action("MakeAnimalSound", "AnimalAction", new { Model })

现在,如果我要执行类似此示例的操作,Controller 中的 if 语句只会将 animal 视为 Animal 而不是 Dog 或 Cat 原来的样子。

有人知道怎么做吗?我觉得应该很简单。

4

2 回答 2

3

一个更好的选择是做这样的事情。测试类类型是一个糟糕的设计,并且在大多数情况下被认为是代码异味(有时这是必要的,但通常还有其他方法可以在没有它的情况下完成您想要的事情):

public class Animal
{
     public virtual Sound {get;}
}
public class Dog : Animal
{
     public override Sound {get {return "Woof";}}
}
public class Cat : Animal
{
     public override Sound {get {return "Meow";}}
}

public ActionResult MakeAnimalSound(Animal animal)
{
   return PartialView("~/Views/_AnimalActionView.cshtml", new{sound=animal.Sound});
}
于 2013-06-26T00:02:20.320 回答
2

如果你调用对象的 GetType() 方法,你会得到一个对象,它会告诉你你需要知道的一切。请参阅System.Type 上的 MSDN 页面

以下程序输出Child.

internal class Parent {
    private string Something { get; set; }
}

internal class Child : Parent {
    private int SomethingElse { get; set; }
}

internal class Program {

    private static void Main(string[] args) {
        Parent reallyChild = new Child();
        Console.WriteLine(reallyChild.GetType().Name);
        Console.ReadLine();
    }
}
于 2013-06-25T23:55:47.653 回答