none
Динамический выбор класса RRS feed

  • Вопрос

  • Здравствуйте!

    Интересует вопрос, возможно ли в  C# использовать динамически разные классы. То есть, у меня есть папка с классами каждый класс наследуется от одного и того же интерфейса. Следовательно методы у меня возвращают одну и туже структуру данных, но соответственно с разными данными. Так же у меня есть к примеру List<string> в котором хранятся строки с названием классов (список вполне возможно будет формироваться запросом из базы). В функцию роутера я буду передавать параметр в котором будет значение с которым мне нужно будет сравнить есть ли оно в моем списке, и если есть то создать объект именно того класса название которого я получу из списка. И далее работать именно с этим объектом. Возможно ли такое реализовать? Надеюсь моя мысль понятна! Если поможете буду Вам искренне благодарен!

    20 августа 2014 г. 10:44

Ответы

  • Можно использовать Activator.CreateInstance.
    • Помечено в качестве ответа Ercheph 21 августа 2014 г. 11:49
    20 августа 2014 г. 19:31
  • Вот пример:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace ConsoleApplication
    {
        internal class Program
        {
            private static void Main(string[] args)
            {
                Function("Class2");
            }
    
            private static void Function(string typeName)
            {
                if (string.IsNullOrEmpty(typeName))
                {
                    throw new ArgumentException();
                }
    
                var list = new List<string> { "Class1", "Class2", "Class3" };
                if (list.SingleOrDefault(n => n == typeName) != null)
                {
                    var type = Type.GetType("ConsoleApplication." + typeName);
                    
                    if (type != null)
                    {
                        var instance = Activator.CreateInstance(type);
    
                        ((Test) instance).TestMethod();
                    }
                }
            }
        }
    
        public interface Test
        {
            void TestMethod();
        }
    
        public class Class1 : Test
        {
            public void TestMethod()
            {
                Console.WriteLine("Class 1");
            }
        }
    
        public class Class2 : Test
        {
            public void TestMethod()
            {
                Console.WriteLine("Class 2");
            }
        }
    
        public class Class3 : Test
        {
            public void TestMethod()
            {
                Console.WriteLine("Class 3");
            }
        }
    }


    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Ercheph 21 августа 2014 г. 11:49
    21 августа 2014 г. 6:57
    Модератор

Все ответы

  • Да, конечно. Это и есть полиморфизм. А для динамической генерации типов можете использовать отражение.

    Сделаем содержимое сообщества лучше, вместе!

    20 августа 2014 г. 10:49
    Модератор
  • Здравствуйте!

    Не совсем понимаю как я это могу применить. Попробую накидать код:

    private void myFunction(string param)
    {
        List<string> _lst = new List<string> {"class1", "class2", "class3"}
        if(_lst.Where(n => n == param).SingleOrDefault() != null)
        {
            var obj = new //"Вот здесь мне нужно как то применить название класса что бы создать объект. Что бы в дальнейшем я мог вызвать методы из obj"
        }
    }

    То есть за счет использования интерфейса я точно буду знать что нужные мне методы будут. Можно будет делать даже проверку на наследование от интерфейса после нахождения. Но мне нужно именно понять как создать объект класса зная только его текстовое название.

    20 августа 2014 г. 11:03
  • Можно использовать Activator.CreateInstance.
    • Помечено в качестве ответа Ercheph 21 августа 2014 г. 11:49
    20 августа 2014 г. 19:31
  • Вот пример:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace ConsoleApplication
    {
        internal class Program
        {
            private static void Main(string[] args)
            {
                Function("Class2");
            }
    
            private static void Function(string typeName)
            {
                if (string.IsNullOrEmpty(typeName))
                {
                    throw new ArgumentException();
                }
    
                var list = new List<string> { "Class1", "Class2", "Class3" };
                if (list.SingleOrDefault(n => n == typeName) != null)
                {
                    var type = Type.GetType("ConsoleApplication." + typeName);
                    
                    if (type != null)
                    {
                        var instance = Activator.CreateInstance(type);
    
                        ((Test) instance).TestMethod();
                    }
                }
            }
        }
    
        public interface Test
        {
            void TestMethod();
        }
    
        public class Class1 : Test
        {
            public void TestMethod()
            {
                Console.WriteLine("Class 1");
            }
        }
    
        public class Class2 : Test
        {
            public void TestMethod()
            {
                Console.WriteLine("Class 2");
            }
        }
    
        public class Class3 : Test
        {
            public void TestMethod()
            {
                Console.WriteLine("Class 3");
            }
        }
    }


    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Ercheph 21 августа 2014 г. 11:49
    21 августа 2014 г. 6:57
    Модератор
  • Огромное спасибо! Выручили!
    21 августа 2014 г. 11:49