В настоящее время я использую это в одном из своих приложений, чтобы создать новый класс
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;