Создание объекта по имени класса

В книге Павла Агурова «C# Сборник рецептов» приводится очень интересный пример по созданию объекта используя его имя. Для того, чтобы создать объект по имени типа используются методы отражения (reflection). Если класс создаваемого объекта находится в том же простанстве имен, что и создающий код, то можно использовать простое создание экземпляра объекта по его типу. Такой способ удобн, если описание набора объектов находится в некотором конфигурационном файле (например, XML). Создание объектов по имени типа позволяет избавиться от оператора switch, создающего нужный объект в зависимости от имени.

using System;

namespace Reflection1
{
    public class TestClass
    {
        public TestClass()
        {
            Console.WriteLine("Конструктор класса TestClass");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Type TestType = Type.GetType("Reflection1.TestClass", false, true);

            //если класс не найден
            if (TestType != null)
            {
                //получаем конструктор
                System.Reflection.ConstructorInfo ci = TestType.GetConstructor(new Type[] { });

                //вызываем конструтор
                object Obj = ci.Invoke(new object[] { });
            }
            else
            {
                Console.WriteLine("Класс не найден");
            }
        }
    }
}

Если класс имеет несколько конструкторов или конструктор с параметрами, то необходимо указать, какой именно контсруктор нужно найти:


using System;

namespace Reflection1
{
    public class TestClass
    {
        public TestClass()
        {

        }

        public TestClass(int x, string str)
        {

        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Type TestType = typeof(TestClass);

            //пробуем найти обычный конструктор
            System.Reflection.ConstructorInfo ci1 = TestType.GetConstructor(new Type[] { });
            Console.WriteLine("Констурктор 1 " + ((ci1 == null) ? "не найден" : "найден"));

            //пробуем найти конструктор с параметрами
            System.Reflection.ConstructorInfo ci2 = TestType.GetConstructor(
                new Type[] { typeof(int), typeof(string) });
            Console.WriteLine("Констурктор 2 " + ((ci2 == null) ? "не найден" : "найден"));
        }
    }
}

Вот так просто все это делается.

  Reflection1.rar (19,6 KiB, 723 закачек)

Поделиться в соц. сетях

Опубликовать в Facebook
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Google Buzz
Опубликовать в Одноклассники
Опубликовать в Яндекс
Опубликовать в Мой Мир

Похожие статьи

Оставить комментарий