Создать экземпляр класса в сборке из имени строки

Я не уверен, возможно ли это, и я довольно новичок в использовании сборок в C # .NET.

То, что я хотел бы сделать, это создать экземпляр класса, когда передается строковое имя этого класса. Что-то вроде этого:

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;
          }
      }
 }

Очевидно, что вы не можете сравнивать строки с типами, но это иллюстрирует то, что я пытаюсь сделать: создать тип, найденный в другой сборке, из предоставленной строки.

Какие-нибудь мысли?

EDIT:

После попытки:

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

Я получаю ряд ошибок:

Inconsistent accessibility: parameter type 'MyAssembly.AbstractType' is less accessible than method 'MyNameSpace.MyClass.AssignInitialValues(MyAssembly.AstractType)' 'MyAssembly.AstractType' is inaccessible due to it's protection level The type or namespace name 'MyAssembly' could not be found (are you missing a using directive or an assembly reference?) The type or namespace name 'AbstractType' could not be found (are you missing a using directive or an assembly reference?)

Не совсем уверен, почему он не может найти сборку; Я добавил ссылку на сборку и использую директиву Using для пространства имен в сборке. Что касается уровня защиты, то он вызывает классы (или, скорее, конструкторы классов), которые могут быть только публичными.

Любые подсказки о том, где проблема?

UPDATE:

Просмотрев несколько статей о SO, я наткнулся на это:https://stackoverflow.com/a/1632609/360627 ДелаяAbstractTypeКласс публики решил проблему противоречивой доступности.

Новая ошибка компилятора:

Не удается преобразовать тип «System.Runtime.Remoting.ObjectHandle» на "MyAssembly.AbstractType"

Строка, на которую он ссылается, такова:

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

С помощью.Unwrap() Вытащите меня из этой ошибки, и я думаю, что это правильный способ сделать это (неопределенно). Однако при запуске программы я получаю исключение TypeLoadException при вызове этого кода.

TypeLoadException: не удалось загрузить тип & # x2018; AbstractType & # x2019; из сборки & # x2018; MyNameSpace "...

Я сразу могу заметить, что тип, который он ищет, является правильным, но сборка, в которой он ищет, является неправильной. Глядя вверхActivator.CreateInstance(String, String) Метод показал, что в качестве первого аргумента значение NULL означает, что метод будет выглядеть в исполняемой сборке. Это противоречит требуемому поведению, как в оригинальном посте.

Я пытался использоватьMyAssembly в качестве первого аргумента, но это приводит к ошибке:

& APOS; MyAssembly & APOS; является «пространством имен»; но используется как «переменная»;

яthink что это вызваноMyAssembly не будучи строкой. Однако если я попытаюсь'MyAssembly' Я получаю следующие ошибки компилятора:

Too many characters in character literal The best overloaded method match for 'System.Activator.CreateInstance(System.ActivationContext, string[])' has some invalid arguments Argument 1: cannot convert from 'char' to 'System.ActivationContext' Argument 2: cannot convert from 'string' to 'string[]'

Мне кажется, что он пытается использовать неправильную перегрузку.

Есть мысли о том, как это исправить?

Ответы на вопрос(3)

Ваш ответ на вопрос