Activator.CreateInstance с унаследованным классом не в том же проекте - PullRequest
0 голосов
/ 27 марта 2012

У меня есть решение, которое содержит два проекта.Прежде всего позвольте мне описать мой сценарий.Проект 1: содержит вызовы базового класса MyBaseClass со следующими двумя интересующими меня свойствами и методом:

TypeToLoad - свойство статической строки, класс которой унаследован для создания экземпляра с простой функциональностью get / set.

Instance - статическое свойство, которое возвращает экземпляр MyBaseClass типа, указанного в TypeToLoad, со следующими строками кода:

public static MyBaseClass Instance{
   return (MyBaseClass)Activator.CreateInstance(Type.typeof(TypeToLoad));
}

теперь во втором проекте я наследую MyBaseClass следующим образом (конечно же, собственное пространство имен иссылки были добавлены).

public class MyInheritClass : MyBaseClass {
    //implements all other functions of MyBaseClass;
}

и один из моих других файлов кода, в том же проекте, что и MyInheritClass, у меня есть следующие строки кода:

Type myType = Type.typeof("MyInheritClass"); //returns the correct "Type"
MyBaseClass.TypeToLoad = "MyInheritClass";
MyBaseClass myInstance = MyBaseClass.Instance; //Errors... because Type.typeof(...) could not resolve "MyInheritClass".

Когда я двигаюсьФайл кода MyInheritClass в том же проекте, что и MyBaseClass, код выполняется просто отлично.

Мой вопрос заключается в том, есть ли возможность создать экземпляр MyInheritClass с помощью MyBaseClass.Instance, установив MyBaseClass.TypeToLoad = "MyInheritClass" без необходимостиесть эти два класса в одном проекте (MyBaseClзадница в базовой библиотеке классов DLL и MyInheritClass в другом проекте, ссылающемся на библиотеку DLL MyBaseclass)?

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

1 Ответ

2 голосов
/ 27 марта 2012

Если вы на самом деле имеете в виду Type.GetType() (а не Type.typeof(), который не будет компилироваться), то это четко задокументировано как выполнение именно того, что вы наблюдаете:

Завершенное сборкой имя типа для получения. […] Если тип находится в текущей выполняющейся сборке или в Mscorlib.dll, достаточно указать имя типа, соответствующее его пространству имен.

Также объясняется, как это исправить: добавьте имя сборки в имя типа. Итак, если ваш тип вызывается в MyInheritClass, он находится в пространстве имен MyNamespace и в сборке MyAssembly (обычно совпадает с именем проекта), вы можете установить имя типа на

MyNamespace.MyInheritClass, MyAssembly

и оно должно работать.

Кроме того, вам следует избегать использования строк для имен типов, поскольку использование реальных Type объектов намного безопаснее. TypeToLoad должно быть типа Type, а не string.

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

...