C # как проверить, является ли базовый класс экземпляром производного класса - PullRequest
0 голосов
/ 05 июля 2018

Как проверить из базового класса, является ли он экземпляром производного класса:

class A0 : A {};
class A1 : A {};
class A2 : A {};

class A 
{
    void CheckDerived() 
    {
        if (this is A0) 
        {
            //Do something when instance is A0
        } 
        else if (this is A1) 
        {
            //Do something when instance is A1
        } 
        else if (this is A2) 
        {
            //Do something when instance is A2
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Вы должны сделать это, используя типы классов и метод IsAssignableFrom

  public class Program
{
public static void Main()
{
    A a = new A0();
    a.CheckDerived();

 }
}

class A0 : A {};
class A1 : A {};
class A2 : A {};
class A {
public void CheckDerived() {
    if(this.GetType().IsAssignableFrom(typeof(A0))) Console.Write("A0");
    if(this.GetType().IsAssignableFrom(typeof(A1))) Console.Write("A1");
    if(this.GetType().IsAssignableFrom(typeof(A2))) Console.Write("A2");
}
}
0 голосов
/ 05 июля 2018

Код в вопросе должен делать то, что вы хотите, однако, как писал Дэнни Гудбол в своем комментарии, это очень плохая практика.

Согласно принципу открытия / закрытия , утверждающему, что «программные объекты (классы, модули, функции и т. Д.) Должны быть открыты для расширения, но закрыты для модификации»,
Правильный способ обработки различных действий для разных детей - использовать переопределение:

Сделайте метод виртуальным (может быть, даже лучше, как абстрактный метод) и переопределите его в каждом производном классе с его собственной реализацией:

class A
{
     virtual void CheckDerived() { throw new NotImplementedException(); }
}

class A0 : A
{
     void override CheckDerived() { Console.WriteLine("A0"); }
}

class A1 : A
{
     void override CheckDerived() { Console.WriteLine("A1"); }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...