Pergunta

Eu tenho um monte de nós filho MDI que são criados da mesma forma e para reduzir código redundante que eu gostaria de ser capaz de chamar um método, passa uma string (nome do nó filho), tem que criar o nó e adicioná-lo ao pai.

Eu posso fazer todas as coisas, exceto criar a classe a partir de uma seqüência de um nome de classe, como posso fazer isso?

Foi útil?

Solução

Atualmente estou usando isso em uma das minhas aplicações para Nova-se uma classe

public static IMobileAdapter CreateAdapter(Type AdapterType)
{
  return (IMobileAdapter)System.Activator.CreateInstance(AdapterType);
}

Ele está retornando uma instância de uma classe que implementa IMobileAdapter, mas você pode usá-lo igualmente facilmente com uma string:

public static IMyClassInterface CreateClass(string MyClassType)
{
  return (IMyClassInterface)System.Activator.CreateInstance(Type.GetType(MyClassType));
}

chamá-lo usando código semelhante ao seguinte:

IMyClassInterface myInst = CreateClass("MyNamespace.MyClass, MyAssembly");

É claro, a classe que cria deve implementar a interface de IMyClassInterface neste caso, mas com uma fábrica de classes, você provavelmente tem todas as suas classes que implementam a mesma interface de qualquer maneira.

Editar:

Em referência ao seu comentário, para o propósito desta discussão, acha do termo "assembléia" como o conjunto de arquivos dentro do seu projeto vb / cs. Estou assumindo que você está fazendo isso tudo dentro de um único projeto [assembly] e não se espalhando ao longo de vários projectos.

No seu caso como suas classes estará estendendo o objeto Form, você faria algo assim.

Form myInst = CreateClass("MyExtendedForm");

ou

Form myInst = CreateClass(Type.GetType("MyExtendedForm"));

Dependendo se você obter o tipo dentro do seu método CreateClass ou fora dela. Você precisaria lançar o seu exemplo para o tipo correto, a fim de aceder a quaisquer membros personalizados. Considere o seguinte:

class MyCustomForm : Form
{
    public int myCustomField{ get; set; }
}

Eu tenho um formulário personalizado que estende Formulário adicionando a propriedade myCustomField. Eu quero instanciar isso usando Activator.CreateInstance ():

public static Form CreateClass(string InstanceName)
{
    return (Form)System.Activator.CreateInstance(Type.GetType(InstanceName));
}

Em seguida, chamá-lo usando:

Form myInst = CreateClass("MyCustomForm");

Então agora eu tenho meu formulário personalizado armazenado em MYINST. No entanto, para acessar a propriedade personalizada [myCustomField], você precisaria para lançar sua instância para a forma correta:

int someVal = ((Type.GetType("MyCustomForm"))myInst).myCustomField;

Outras dicas

Activator.CreateInstance(Type.GetType(typeName))

Se você tem uma string que é o nome da classe, então você deve ser capaz de obter um objeto do mesmo tipo, chamando Type.GetType (string). A partir desse tipo, você deve ser capaz de usar a reflexão para gerar um objeto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top