2013-03-13 2 views
1

У меня возникла необычная проблема. Я работаю над динамическим заводским проектом, и я намерен создать новые объекты на основе XML-файла. Моя проблема заключается в следующем:Type.GetType() проблема видимости между проектами (Visual C#)

  1. У меня есть отдельный проект для базовых классов для завода, где у меня есть

    public abstract class DynamicContentFactory<T, Params> where T: class where Params: DynamicParameters 
    
  2. В этом абстрактном классе у меня есть статический метод Create следующим

    public static T Create(Params data) 
    
  3. Params включает только одну строку по умолчанию Type. Я хочу, чтобы ограничить создание объектов в том же пространстве имен в качестве базового класса T, так что я следующее:

    string namespaceStr = typeof(T).ToString(); 
    namespaceStr = namespaceStr.Substring(0, namespaceStr.LastIndexOf('.') + 1); 
    
    Type type = Type.GetType(namespaceStr + data.Type); 
    
  4. В моем главном проекте, я есть конкретный класс фабрики

    public class ItemFactory : DynamicContent.DynamicContentFactory<ItemFactory, ItemParameters> 
    { 
    } 
    
  5. Проблема в том, что когда я звоню ItemFactory.Create, Type.GetType возвращает null. ItemFactory находится в том же пространстве имен, что и элементы, которые я хочу создать, но базовый класс находится в другом. Есть ли способ обойти это?

  6. Я попытался изменить параметр Type.GetType() на номер typeof(T).ToString(), чтобы проверить, может ли он его найти, и он не нашел его. Я не могу создать ссылку из моего проекта DynamicContent в свой основной проект, потому что ссылка на другой путь уже существует. Я чувствую, что это глупо, что он не может даже найти тип класса он был инициализирован в

Так что мой вопрос:. Что бы лучший способ обойти это? Я бы предпочел сохранить свой проект DynamicContent в отдельном проекте в качестве отдельной библиотеки, а не включать его в свой основной проект. Есть ли способ заставить его найти классы или мне нужно создать третий проект для типов, которые я хочу инициализировать с этим, чтобы иметь возможность ссылаться на него как из основного проекта, так и из проекта DynamicContent?

BR,

-Sami

ответ

4

Поведения вы наблюдаете, как ожидается, - Type.GetType

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

Обратите внимание, что ваш текущий код работает, потому что он подпадает под часть «в настоящее время выполняющая сборку» указанного поведения, где достаточно просто пространства имен + имени.

  • Необходимо указать полное имя типа при его запросе, но вы можете проверить, какое пространство имен будет использовать этот тип.
  • Вы можете переключиться на Assembly.GetType вместо Type.GetType и использовать сборку T для типов поиска, которые вы хотите создать.
  • Альтернатива - сканировать все загруженные сборки для нужного вам типа, но может быть недостаточно, если тип поступает из еще не загруженной сборки.

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

+0

Спасибо! Это ясно говорит об этом. Я только что узнал что-то в этом роде, так как мне удалось обойти его, вызвав Assembly.GetCallingAssembly(). GetType(). Я думаю, что делать это было бы плохо, так как мы не гарантируем, что CallingAssembly включит T. –

+0

Не забывайте некоторые другие функции пространств имен, такие как разрешение двусмысленности между типами с одинаковыми именами и т. Д. – Charleh

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