Часто требуется создать экземпляр некоторого класса по его имени. Например, для конфигурации некоторой программы - имя нужного класса может хранится в конфигурационном файле. Или же имя может задать пользователь в каком-нибудь диалоговом окне приложения.
В приведенном ниже примере для Windows мы сделаем это через метод CreateInstance класса Activator. Для этого примера нам понадобятся один интерфейс ISomeInterface и два производных от него класса Class1 и Class2. В принципе можно обойтись и без них, но с ними легче показать, что экземпляры наших классов Class1 и Class2 действительно создаются. Вот объявление интерфейса:
namespace WindowsApplication1
{
public interface ISomeInterface
{
void SomeMethod();
}
}
Как вы видите, мы тут ввели некоторый метод SomeMethod.
А вот объявление двух классов:
namespace WindowsApplication1
{
public class Class1: ISomeInterface
{
public void SomeMethod()
{
System.Windows.Forms.MessageBox.Show("Class1");
}
}
}
и
namespace WindowsApplication1
{
public class Class2: ISomeInterface
{
public void SomeMethod()
{
System.Windows.Forms.MessageBox.Show("Class2");
}
}
}
Как вы видите, оба эти класса являются потомками объявленного ранее интерфейса. Реализация метода SomeMethod у них очень похожа - каждый класс показывает своем имя в messagebox'е.
|
|
Теперь код, непосредственно создающий экземпляр класса по имени. Добавьте на форму кнопку и текстовое поле. В обработчике для кнопки напишите такой код (он и есть самый важный в нашем приложении):
private void button4_Click(object sender, System.EventArgs e)
{
// Получаем тип по имени.
Type t = Type.GetType("WindowsApplication1."+textBox1.Text);
// Создаем переменную по типу.
ISomeInterface w = (WindowsApplication1.ISomeInterface)
Activator.CreateInstance(t);
// Вызываем метод.
w.SomeMethod();
}
Запускаем программу. При вводе в текстовое поле имени соответствующего класса и нажатии на кнопку создастся его экземпляр - это мы увидим по соотвествующему messagebox'у: