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

В книге Павла Агурова “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) ? "не найден" : "найден"));
        }
    }
}

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

[download id=”9″]

Leave a Reply

Your email address will not be published. Required fields are marked *

http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_bye.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_good.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_negative.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_scratch.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_wacko.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_yahoo.gif 
http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_cool.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_heart.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_rose.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_smile.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_whistle3.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_yes.gif 
http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_cry.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_mail.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_sad.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_unsure.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_wink.gif