Criar uma instância de classe no assembly a partir do nome da string
Eu não tenho certeza se isso é possível, e eu sou muito novo para usar assemblies em c # .net.
O que eu gostaria de fazer é criar uma instância de uma classe quando fornecido o nome da string dessa classe. Algo assim:
using MyAssembly;
namespace MyNameSpace
{
Class MyClass
{
int MyValue1;
int MyValue2;
public MyClass(string myTypeName)
{
foreach(Type type in MyAssembly)
{
if((string)type == myTypeName)
{
//create a new instance of the type
}
}
AssignInitialValues(//the type created above)
}
//Here I use an abstract type which the type above inherits from
private void AssignInitialValues(AbstractType myClass)
{
this.value1 = myClass.value1;
this.value2 = myClass.value2;
}
}
}
Obviamente, você não pode comparar strings a tipos, mas ilustra o que estou tentando fazer: criar um tipo encontrado em um assembly diferente de uma string fornecida.
Alguma ideia?
EDITAR:
Depois de tentar:
var myObject = (AbstractType) Activator.CreateInstance(null, myTypeName);
AssignInitialValues(myObject);
Eu recebo vários erros:
Acessibilidade inconsistente: o tipo de parâmetro 'MyAssembly.AbstractType' é menos acessível que o método 'MyNameSpace.MyClass.AssignInitialValues (MyAssembly.AstractType)''MyAssembly.AstractType' está inacessível devido ao seu nível de proteçãoNão foi possível encontrar o tipo ou o nome do namespace 'MyAssembly' (você está perdendo uma diretiva usando ou uma referência de assembly?)Não foi possível encontrar o tipo ou o nome do namespace 'AbstractType' (você está perdendo uma diretiva usando ou uma referência de assembly?)Não sei exatamente por que não consegue encontrar a montagem; Eu adicionei uma referência à montagem e uso uma diretiva de uso para o namespace na montagem. Quanto ao nível de proteção, está chamando classes (ou melhor, os construtores de classes) que só podem ser públicos.
Alguma pista sobre onde está o problema?
ATUALIZAR:
Depois de ler vários artigos sobre o SO, descobri o seguinte:https://stackoverflow.com/a/1632609/360627 Fazendo oAbstractType
público de classe resolveu a questão da acessibilidade inconsistente.
O novo erro do compilador é este:
Não é possível converter o tipo 'System.Runtime.Remoting.ObjectHandle' para 'MyAssembly.AbstractType'
A linha que ele faz referência é esta:
var myObject = (AbstractType) Activator.CreateInstance(null, myTypeName);
Usando.Unwrap()
me tira desse erro e acho que é o jeito certo de fazer isso (incerto). No entanto, ao executar o programa, recebo uma TypeLoadException quando esse código é chamado.
TypeLoadException: não foi possível carregar o tipo "AbstractType" do assembly "MyNameSpace" ...
Imediatamente posso identificar que o tipo que está procurando está correto, mas a montagem em que está olhando está errada. Olhando para cimaActivator.CreateInstance(String, String)
método revelou que o nulo como o primeiro argumento significa que o método será exibido no assembly em execução. Isso é contrário ao comportamento exigido como no post original.
Eu tentei usarMyAssembly
como o primeiro argumento, mas isso produz o erro:
'MyAssembly' é um 'namespace' mas é usado como uma 'variável'
I pensar que isso é causado porMyAssembly
não sendo uma string. No entanto, se eu tentar'MyAssembly'
Eu recebo os seguintes erros do compilador:
Parece que estou tentando usar a sobrecarga errada.
Alguma ideia de como consertar isso?