我有一个部分视图,我想能够使用几个不同的模型。是否有任何方法可以找出对象的Child类在作为父对象传递时是什么?
例如:
型号:
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 })
现在,如果我要做类似这个例子的事情,那么控制器中的if语句只会将动物视为动物,而不是它最初的狗或猫。
任何人都知道如何做到这一点?我觉得应该很简单。
答案 0 :(得分: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});
}
答案 1 :(得分:2)
如果调用对象的GetType()方法,您将获得一个对象,告诉您需要知道的所有内容。请参阅the MSDN page on System.Type。
以下程序输出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();
}
}