У меня возникла необычная проблема. Я работаю над динамическим заводским проектом, и я намерен создать новые объекты на основе XML-файла. Моя проблема заключается в следующем:Type.GetType() проблема видимости между проектами (Visual C#)
У меня есть отдельный проект для базовых классов для завода, где у меня есть
public abstract class DynamicContentFactory<T, Params> where T: class where Params: DynamicParameters
В этом абстрактном классе у меня есть статический метод
Create
следующимpublic static T Create(Params data)
Params
включает только одну строку по умолчаниюType
. Я хочу, чтобы ограничить создание объектов в том же пространстве имен в качестве базового классаT
, так что я следующее:string namespaceStr = typeof(T).ToString(); namespaceStr = namespaceStr.Substring(0, namespaceStr.LastIndexOf('.') + 1); Type type = Type.GetType(namespaceStr + data.Type);
В моем главном проекте, я есть конкретный класс фабрики
public class ItemFactory : DynamicContent.DynamicContentFactory<ItemFactory, ItemParameters> { }
Проблема в том, что когда я звоню
ItemFactory.Create
,Type.GetType
возвращаетnull
.ItemFactory
находится в том же пространстве имен, что и элементы, которые я хочу создать, но базовый класс находится в другом. Есть ли способ обойти это?Я попытался изменить параметр
Type.GetType()
на номерtypeof(T).ToString()
, чтобы проверить, может ли он его найти, и он не нашел его. Я не могу создать ссылку из моего проектаDynamicContent
в свой основной проект, потому что ссылка на другой путь уже существует. Я чувствую, что это глупо, что он не может даже найти тип класса он был инициализирован в
Так что мой вопрос:. Что бы лучший способ обойти это? Я бы предпочел сохранить свой проект DynamicContent
в отдельном проекте в качестве отдельной библиотеки, а не включать его в свой основной проект. Есть ли способ заставить его найти классы или мне нужно создать третий проект для типов, которые я хочу инициализировать с этим, чтобы иметь возможность ссылаться на него как из основного проекта, так и из проекта DynamicContent
?
BR,
-Sami
Спасибо! Это ясно говорит об этом. Я только что узнал что-то в этом роде, так как мне удалось обойти его, вызвав Assembly.GetCallingAssembly(). GetType(). Я думаю, что делать это было бы плохо, так как мы не гарантируем, что CallingAssembly включит T. –
Не забывайте некоторые другие функции пространств имен, такие как разрешение двусмысленности между типами с одинаковыми именами и т. Д. – Charleh