2

いくつかの異なるモデルで使用できるようにしたい部分ビューがあります。オブジェクトが親として渡されたときに、オブジェクトの 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"});
       }
    }
}

犬のページの親ビュー:

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

今、私がこの例のようなことをするとしたら、コントローラーの if ステートメントは動物を動物としてしか認識せず、本来の犬や猫として認識しません。

誰でもこれを行う方法を知っていますか? シンプルでいい気がします。

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 に答える