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.
c#
.net
instantiation
system.type
PeteT
fonte
fonte
Respostas:
Dê uma olhada no método Activator.CreateInstance .
fonte
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 sejaVehicles
, depois passe o parâmetro como oVehicles.Car
que retorna o objeto do tipoCar
. Assim, você pode criar qualquer instância de qualquer classe dinamicamente.Se o seu nome completo (ou seja,
Vehicles.Car
neste caso) estiver em outra montagem, o valorType.GetType
será nulo. Nesses casos, você percorre todas as montagens e encontra oType
. Para isso você pode usar o código abaixoAgora, se você quiser chamar um construtor parametrizado, faça o seguinte
ao invés de
fonte
dynamic
código - consulte stackoverflow.com/a/2690661/904521 )strFullyQualifiedName
comstr
,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:
Você precisará converter o objeto retornado para o tipo de objeto desejado.
fonte
Provavelmente minha pergunta deveria ter sido mais específica. Na verdade, eu conheço uma classe base para a string, então resolvi:
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.
fonte
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.
fonte
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:
fonte
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.
fonte
por que você quer escrever um código como este? Se você tiver uma classe 'ReportClass' disponível, instancie-a diretamente, como mostrado abaixo.
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.fonte