Вопрос

У меня есть несколько дочерних узлов 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). От этого типа вы должны быть в состоянии использовать отражение для создания объекта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top