Создать экземпляр класса в сборке из имени строки
Я не уверен, возможно ли это, и я довольно новичок в использовании сборок в 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'
Я получаю следующие ошибки компилятора:
Мне кажется, что он пытается использовать неправильную перегрузку.
Есть мысли о том, как это исправить?