Вопрос
У меня есть несколько дочерних узлов MDI, которые созданы одинаковым образом, и чтобы уменьшить избыточный код, я хотел бы иметь возможность вызывать метод, передавать ему строку (имя дочернего узла), создавать узел и добавьте его к родителю.
Я могу делать все, кроме создания класса из строки имени класса. Как мне это сделать?
Решение
В настоящее время я использую это в одном из своих приложений, чтобы создать новый класс.
public static IMobileAdapter CreateAdapter(Type AdapterType)
{
return (IMobileAdapter)System.Activator.CreateInstance(AdapterType);
}
Он возвращает экземпляр класса, реализующего IMobileAdapter, но вы можете использовать его так же легко со строкой:
public static IMyClassInterface CreateClass(string MyClassType)
{
return (IMyClassInterface)System.Activator.CreateInstance(Type.GetType(MyClassType));
}
Вызовите его, используя код, подобный следующему:
IMyClassInterface myInst = CreateClass("MyNamespace.MyClass, MyAssembly");
Конечно, в этом случае создаваемый класс должен реализовывать интерфейс IMyClassInterface, но при использовании фабрики классов все ваши классы, скорее всего, в любом случае будут реализовывать один и тот же интерфейс.
Редактировать:
Что касается вашего комментария, для целей этого обсуждения подумайте о термине «сборка» как о наборе файлов в вашем проекте vb/cs.Я предполагаю, что вы делаете все это в рамках одного проекта [сборки], а не распространяетесь на несколько проектов.
В вашем случае, поскольку ваши классы будут расширять объект Form, вы должны сделать что-то вроде этого.
Form myInst = CreateClass("MyExtendedForm");
Или
Form myInst = CreateClass(Type.GetType("MyExtendedForm"));
В зависимости от того, получаете ли вы тип внутри метода CreateClass или вне его.Вам нужно будет привести свой экземпляр к правильному типу, чтобы получить доступ к любым пользовательским членам.Учти это:
class MyCustomForm : Form
{
public int myCustomField{ get; set; }
}
У меня есть пользовательская форма, которая расширяет форму, добавляя свойство myCustomField.Я хочу создать экземпляр этого с помощью Activator.CreateInstance():
public static Form CreateClass(string InstanceName)
{
return (Form)System.Activator.CreateInstance(Type.GetType(InstanceName));
}
Затем я вызываю его, используя:
Form myInst = CreateClass("MyCustomForm");
Итак, теперь у меня есть собственная форма, хранящаяся в myInst.Однако для доступа к пользовательскому свойству [myCustomField] вам необходимо привести экземпляр к правильной форме:
int someVal = ((Type.GetType("MyCustomForm"))myInst).myCustomField;
Другие советы
Activator.CreateInstance(Type.GetType(typeName))
Если у вас есть строка, которая является именем класса, то вы сможете получить от нее объект Type, вызвав Type.GetType (string). От этого типа вы должны быть в состоянии использовать отражение для создания объекта. Р>