В книге Павла Агурова “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″]
