Создание объекта по имени класса
В книге Павла Агурова «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, 1 164 закачек)