繁体   English   中英

转换为父类时查找TypeOf Child类

[英]Find TypeOf Child class when casted as Parent

我有一个局部视图,希望可以与几种不同的模型一起使用。 当以对象的父类形式传递对象时,有什么方法可以找出它的子类?

例如:

模型:

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"});
       }
    }
}

狗页面的父视图:

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

现在,如果我要执行类似此示例的操作,那么Controller中的if语句只会将动物视为动物,而不是原来的动物是狗或猫。

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

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

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});
}

如果调用对象的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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM