Автоматическое приведение к производному типу без проверки производного типа? - PullRequest
0 голосов
/ 14 мая 2018

У меня есть список типов, который представляет собой набор различных производных типов. Например:

A
B:A
C:A
D:A

Так что в списке будет B, C, D

Теперь я хочу повторить автоматическое приведение списка к производному типу и вызвать в них метод.

Хотя этот пример короткий, причина, по которой я надеялся выполнить автоматическое приведение к производному типу без проверок, состоит в том, чтобы избежать длинных вещей типа if / else, таких как

if(item[i] is B) (B).Process();
else if(item[i] is C) (C).Process();
// etc etc etc

Это становится утомительно, если у вас есть сложные настройки производных типов.

Есть ли у C # какой-либо способ автоматического приведения к соответствующему highest derived type? Или я застрял с проверкой каждый раз?

1 Ответ

0 голосов
/ 14 мая 2018

используя интерфейс,

    internal interface IProcess
    {
        void Process();
    }
    class AA
    {
    }
    class BB : AA, IProcess
    {
        public void Process() { Console.WriteLine($"Inside: {nameof(BB)}"); }
    }
    class CC : AA, IProcess
    {
        public void Process() { Console.WriteLine($"Inside: {nameof(CC)}"); }
    }
    class DD : AA, IProcess
    {
        public void Process() { Console.WriteLine($"Inside: {nameof(DD)}"); }
    }

просто повторять как,

     var listWithInterface = new List<IProcess> { new BB(), new CC(), new DD() };
     foreach (var item in listWithInterface)
     {
           item.Process();
     }

другим способом может быть использование виртуального метода,

class A
    {
        public virtual void Process() { }
    }
    class B : A
    {
        public override void Process() { Console.WriteLine($"Inside: {nameof(B)}"); }
    }
    class C : A
    {
        public override void Process() { Console.WriteLine($"Inside: {nameof(C)}"); }
    }
    class D : A
    {
        public override void Process() { Console.WriteLine($"Inside: {nameof(D)}"); }
    }

и используйте это как

var list = new List<A> { new B(), new C(), new D() };
            foreach (var item in list)
            {
                item.Process();
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...