Заводская модель в C # - PullRequest
       20

Заводская модель в C #

5 голосов
/ 23 января 2009

У меня есть куча дочерних узлов MDI, которые созданы одинаково и для сокращения избыточного кода я хотел бы иметь возможность вызывать метод, передавать ему строку (имя дочернего узла), создавать узел и добавить его к родителю.

Я могу делать все, кроме создания класса из строки имени класса, как я могу это сделать?

Ответы [ 3 ]

6 голосов
/ 23 января 2009

В настоящее время я использую это в одном из своих приложений, чтобы создать новый класс

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;
3 голосов
/ 23 января 2009
Activator.CreateInstance(Type.GetType(typeName))
0 голосов
/ 23 января 2009

Если у вас есть строка, которая является именем класса, тогда вы сможете получить от нее объект Type, вызвав Type.GetType (string). От этого типа вы должны быть в состоянии использовать отражение для создания объекта.

...