在转换为Parent时查找TypeOf Child类

时间:2013-06-25 23:50:48

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

我有一个部分视图,我想能够使用几个不同的模型。是否有任何方法可以找出对象的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语句只会将动物视为动物,而不是它最初的狗或猫。

任何人都知道如何做到这一点?我觉得应该很简单。

2 个答案:

答案 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();
    }
}
相关问题