2012-03-27 2 views
0

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

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

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" без необходимости иметь эти два класса в одном проекте (MyBaseClass в базовой библиотеке DLL и MyInheritClass в другом проекте, ссылающемся на библиотеку DLL MyBaseclass)?

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

+1

Кстати, вы действительно должны использовать дескриптивные теги, такие как [tag: .net] или [tag: C#].Если вы это сделаете, вы, скорее всего, получите ответ гораздо раньше. – svick

ответ

2

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

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

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

MyNamespace.MyInheritClass, MyAssembly 

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

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

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

+0

Привет, svick, вы абсолютно правы в моей ошибке типа Type.TypeOf() вместо Type.GetType(). – NPToita

+0

Цель меня в этом направлении состоит в том, что, поскольку у меня есть набор поставщиков, которые будут моей базой/базой с функциональностью по умолчанию. И для каждого клиента, который у меня есть, я бы наследовал этих поставщиков по мере необходимости и переопределял их виртуальные методы там, где это было необходимо, и в файле конфигурации укажите тип провайдера на правильный класс поставщика услуг. И я не хочу связывать всех клиентов с одной и той же сборкой, потому что нет смысла, чтобы библиотека клиента A также содержала код клиента B. – NPToita

+0

Представьте, если число клиентов достигнет 100+, было бы ад, чтобы управлять набором кода. Входя в это прямое, это дает мне возможность разрабатывать каждого клиента отдельно по собственному проекту и просто сбрасывать DLL в свое клиентское приложение и указывать провайдеру на класс клиента. Нечто похожее на поставщиков членства. Благодарим вас за решение/предложение. Я определенно дам это попробовать и подам обратно на это. Я довольно какой-то другой человек, у меня тоже такая же проблема, что и у меня. Еще раз большое спасибо. Thinh P. Nguyen – NPToita

Смежные вопросы