Crear una instancia de clase en ensamblador desde el nombre de cadena

No estoy seguro de si esto es posible y soy bastante nuevo en usar ensamblados en C # .NET.

Lo que me gustaría hacer es crear una instancia de una clase cuando se proporciona el nombre de cadena de esa clase. Algo como esto:

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, no puede comparar cadenas con tipos, pero ilustra lo que estoy tratando de hacer: crear un tipo encontrado en un conjunto diferente de una cadena suministrada.

¿Alguna idea?

EDITAR:

Después de intentar:

var myObject = (AbstractType) Activator.CreateInstance(null, myTypeName);
AssignInitialValues(myObject);

Me sale una serie de errores:

Accesibilidad inconsistente: el tipo de parámetro 'MyAssembly.AbstractType' es menos accesible que el método 'MyNameSpace.MyClass.AssignInitialValues ​​(MyAssembly.AstractType)''MyAssembly.AstractType' es inaccesible debido a su nivel de protecciónNo se pudo encontrar el tipo o el nombre de espacio de nombres 'MyAssembly' (¿falta una directiva de uso o una referencia de ensamblado?)No se pudo encontrar el tipo o el nombre de espacio de nombres 'AbstractType' (¿falta una directiva de uso o una referencia de ensamblado?)

No estoy exactamente seguro de por qué no puede encontrar el montaje; He agregado una referencia al ensamblaje y uso una directiva de uso para el espacio de nombres en el ensamblaje. En cuanto al nivel de protección, está llamando a las clases (o más bien a los constructores de las clases) que solo pueden ser públicas.

¿Alguna pista sobre dónde está el problema?

ACTUALIZAR:

Después de mirar varios artículos sobre SO, encontré esto:https://stackoverflow.com/a/1632609/360627 Haciendo elAbstractTypeLa clase pública resolvió el problema de la accesibilidad inconsistente.

El nuevo error del compilador es este:

No se puede convertir el tipo 'System.Runtime.Remoting.ObjectHandle' a 'MyAssembly.AbstractType'

La línea a la que hace referencia es esta:

var myObject = (AbstractType) Activator.CreateInstance(null, myTypeName);

Utilizando.Unwrap() sálvame de este error y creo que es la forma correcta de hacerlo (incierto). Sin embargo, cuando ejecuto el programa obtengo una excepción TypeLoadException cuando se llama a este código.

TypeLoadException: no se pudo cargar el tipo 'AbstractType' desde el ensamblado 'MyNameSpace' ...

De inmediato puedo ver que el tipo que busca es correcto, pero el ensamblaje en el que está mirando es incorrecto. Buscando elActivator.CreateInstance(String, String) El método reveló que el valor nulo como primer argumento significa que el método se verá en el ensamblaje en ejecución. Esto es contrario al comportamiento requerido como en la publicación original.

He intentado usarMyAssembly como el primer argumento pero esto produce el error:

'MyAssembly' es un 'espacio de nombres' pero se usa como una 'variable'

I pensar que esto es causado porMyAssembly no siendo una cuerda Sin embargo si lo intento'MyAssembly' Recibo los siguientes errores del compilador:

Demasiados caracteres en el carácter literal.La mejor coincidencia de método sobrecargada para 'System.Activator.CreateInstance (System.ActivationContext, string [])' tiene algunos argumentos no válidosArgumento 1: no se puede convertir de 'char' a 'System.ActivationContext'Argumento 2: no se puede convertir de 'cadena' a 'cadena []'

Me parece que está tratando de usar la sobrecarga incorrecta.

¿Alguna idea sobre como arreglar esto?

Respuestas a la pregunta(3)

Su respuesta a la pregunta