Er. Dinesh Sharma Ответов: 1

Как уменьшить оператор switch при реализации интерфейса на языке C#


Привет Эксперты,
Пожалуйста, помогите мне найти правильный способ удалить оператор switch, когда интерфейс реализуется по количеству классов.


public enum TestClass
    {
        Test1,
        Test2,
        Test3,
        Test4
    }

    public interface ITest
    {
        void Add();
    }

    public class Test1 : ITest
    {
        public void Add()
        {
            Console.WriteLine("I am Test1");
        }
    }
    public class Test2 : ITest
    {
        public void Add()
        {
            Console.WriteLine("I am Test1");
        }
    }
    public class FindObject
    {
        public ITest GetObject(TestClass testClass)
        {
            switch (testClass)
            {
                case TestClass.Test1:
                    return new Test1();
                case TestClass.Test2:
                    return new Test2();
                case TestClass.Test3:
                    return new Test3();
                case TestClass.Test4:
                    return new Test4();
                default:
                    return new Test1();
            }
        }
    }

I выше кода у нас есть интерфейс ITest и реализован Test1,Test2....Test4..to создайте объект этих классов во время выполнения у нас есть метод GetObject use Switch statement, но я не хочу &использовать оператор switch.Поэтому я попробовал этот подход.

Что я уже пробовал:

Я использовал следующий подход, пожалуйста, предложите, лучше это или нет.
public enum TestClass
   {
       Test1,
       Test2,
       Test3,
       Test4
   }

   public interface ITest
   {
       void Add();
   }

   public class Test1 : ITest
   {
       public void Add()
       {
           Console.WriteLine("I am Test1");
       }
   }
   public class Test2 : ITest
   {
       public void Add()
       {
           Console.WriteLine("I am Test1");
       }
   }
   public class Test
   {
       Dictionary<TestClass, ITest> dicToTest = new Dictionary<TestClass, ITest>();
       public void RegisterClass()
       {
           dicToTest.Add(TestClass.Test1, new Test1());
           dicToTest.Add(TestClass.Test2, new Test2());
           dicToTest.Add(TestClass.Test3, new Test3());
           dicToTest.Add(TestClass.Test4, new Test4());
       }
       public ITest GetObject(TestClass testClass)
       {
           return dicToTest[testClass];
       } 
   }



В приведенном выше подходе мы регистрируем весь класс В словаре, а во время выполнения получаем объект класса на основе перечисления.

Но проблема с таким подходом
1)Когда мы регистрируем класс В словаре, мы должны создать новый объект (новый Тест1())
это мы едим память времени регистрации. Есть ли другое решение для решения этой проблемы?.
2) Существует ли какой-либо общий способ решения этой проблемы?
3) я не использовал никакой фреймворк зависимостей.

Er. Dinesh Sharma

Есть ли другой способ решить эту проблему?

1 Ответов

Рейтинг:
1

Midi_Mick

У меня возникло бы искушение полностью удалить перечисление и использовать дженерики.

public class Test<T> where T: ITest, new() {
    public ITest GetObject() { return new T(); }
}

или, если он немного лучше подходит вашему стилю, возьмите универсальный < t> из теста класса и просто примените его к методу GetObject() :
public class Test {
    public ITest GetObject<T>() where T: ITest, new() { return new T(); }
}