Урок 21. Как создать экземпляр класса по его имени?
Автор: admin | 20 Июнь 2008 – 19:43 -Урок 21. Как создать экземпляр класса по его имени?
Часто требуется создать экземпляр некоторого класса по его имени. Например, для конфигурации некоторой программы – имя нужного класса может хранится в конфигурационном файле. Или же имя может задать пользователь в каком-нибудь диалоговом окне приложения.
В приведенном ниже примере для 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(); }
Запускаем программу.
Tags: Activator, CreateInstance, EventArgs, Forms, GetType, interface, ISomeInterface, MessageBox, namespace, System, textbox, WindowsApplication
Находится в Windows и C# | No Comments »
Ответить
Вы должны быть в системе, дабы комментировать.
