Existe uma maneira de criar uma instância de uma classe com base no fato de eu saber o nome da classe em tempo de execução. Basicamente, eu teria o nome da classe em uma string.
Existe uma maneira de criar uma instância de uma classe com base no fato de eu saber o nome da classe em tempo de execução. Basicamente, eu teria o nome da classe em uma string.
Respostas:
Dê uma olhada no método Activator.CreateInstance .
var driver = (OpenQA.Selenium.IWebDriver)Activator.CreateInstance("WebDriver", "OpenQA.Selenium.Firefox.FirefoxDriver").Unwrap();
É bem simples. Suponha que seu nome de classe seja Car
e o namespace seja Vehicles
, depois passe o parâmetro como o Vehicles.Car
que retorna o objeto do tipo Car
. Assim, você pode criar qualquer instância de qualquer classe dinamicamente.
public object GetInstance(string strFullyQualifiedName)
{
Type t = Type.GetType(strFullyQualifiedName);
return Activator.CreateInstance(t);
}
Se o seu nome completo (ou seja, Vehicles.Car
neste caso) estiver em outra montagem, o valor Type.GetType
será nulo. Nesses casos, você percorre todas as montagens e encontra o Type
. Para isso você pode usar o código abaixo
public object GetInstance(string strFullyQualifiedName)
{
Type type = Type.GetType(strFullyQualifiedName);
if (type != null)
return Activator.CreateInstance(type);
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
{
type = asm.GetType(strFullyQualifiedName);
if (type != null)
return Activator.CreateInstance(type);
}
return null;
}
Agora, se você quiser chamar um construtor parametrizado, faça o seguinte
Activator.CreateInstance(t,17); // Incase you are calling a constructor of int type
ao invés de
Activator.CreateInstance(t);
dynamic
código - consulte stackoverflow.com/a/2690661/904521 )
strFullyQualifiedName
com str
, fullyQualifiedName
fará o trabalho.
str
- chave é usada como parte da convenção de nomenclatura para variáveis. Certas organizações e projetos insistem em seguir isso, por isso eu usei. Se você tivesse trabalhado em certas organizações / projetos, saberá disso. Como você disse sem, str
também fará o trabalho :) @MehdiDehghani #
Eu usei esse método com sucesso:
System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)
Você precisará converter o objeto retornado para o tipo de objeto desejado.
Provavelmente minha pergunta deveria ter sido mais específica. Na verdade, eu conheço uma classe base para a string, então resolvi:
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
A classe Activator.CreateInstance possui vários métodos para obter a mesma coisa de maneiras diferentes. Eu poderia lançá-lo em um objeto, mas o acima é mais útil para a minha situação.
Eu sei que estou atrasado para o jogo ... mas a solução que você está procurando pode ser a combinação dos itens acima e usar uma interface para definir os aspectos acessíveis ao público dos seus objetos.
Então, se todas as suas classes que seriam geradas dessa maneira implementarem essa interface, você poderá apenas converter como o tipo de interface e trabalhar com o objeto resultante.
Para criar uma instância de uma classe a partir de outro projeto na solução, você pode obter o assembly indicado pelo nome de qualquer classe (por exemplo BaseEntity) e criar uma nova instância:
var newClass = System.Reflection.Assembly.GetAssembly(typeof(BaseEntity)).CreateInstance("MyProject.Entities.User");
Por exemplo, se você armazenar valores de vários tipos em um campo do banco de dados (armazenado como string) e tiver outro campo com o nome do tipo (por exemplo, String, bool, int, MyClass), a partir desses dados do campo, você poderá, possivelmente, crie uma classe de qualquer tipo usando o código acima e preencha-o com o valor do primeiro campo. Obviamente, isso depende do tipo que você está armazenando e de um método para analisar as seqüências de caracteres no tipo correto. Eu usei isso muitas vezes para armazenar configurações de preferência do usuário em um banco de dados.
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
por que você quer escrever um código como este? Se você tiver uma classe 'ReportClass' disponível, instancie-a diretamente, como mostrado abaixo.
ReportClass report = new ReportClass();
O código ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
é usado quando você não possui a classe necessária disponível, mas deseja instanciar e / ou chamar um método dinamicamente.
Quero dizer, é útil quando você conhece o assembly, mas ao escrever o código, você não tem a classe ReportClass
disponível.