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 oAbstractTypepú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:

Muitos caracteres no literal do caractereA melhor correspondência de método sobrecarregado para 'System.Activator.CreateInstance (System.ActivationContext, string [])' tem alguns argumentos inválidosArgumento 1: não é possível converter de 'char' para 'System.ActivationContext'Argumento 2: não é possível converter de 'string' para 'string []'

Parece que estou tentando usar a sobrecarga errada.

Alguma ideia de como consertar isso?

questionAnswers(3)

yourAnswerToTheQuestion