Как ссылаться на модуль (во время выполнения), если у меня есть только его строковое имя в Delphi?

#delphi #reference #delphi-units

#delphi #ссылка #delphi-units

Вопрос:

У меня есть типы в разных единицах с одинаковым именем, и у меня есть имя единицы в строке. Мне нужно получить доступ к определенному типу этого модуля. Как мне это сделать?

Пример:

 unit Unit1

type
   TFooType = (
      bar1,
      bar2
   );
  

тогда у меня есть другой модуль

 unit Unit2

type
   TFooType = (
      foo1,
      foo2,
      foo3
   );      
  

И где-то в моем коде у меня есть строковая переменная «UnitName» со значением ‘Unit1’ внутри нее, и я хочу получить доступ к типу Unit1 «TFooType» с помощью переменной.

Я использую Delphi 2007

Извините за мой плохой английский.

Заранее спасибо.

Комментарии:

1. Для этого вы должны использовать КЛАССЫ, а не ЕДИНИЦЫ. Изучите немного объектно-ориентированного программирования. Единицами таким образом манипулировать нельзя. Вы можете зарегистрировать классы и идентификатор (имя класса или любую строку) и легко выполнить быстрый поиск из строки в ссылку на класс, из которой затем можно создать экземпляр класса. Или вы можете использовать ИНТЕРФЕЙСЫ delphi и шаблон контейнера IoC (инверсия управления).

Ответ №1:

Вы не можете выбрать, какие модули включать во время выполнения. Модули — это концепция времени компиляции.

Кроме того, ваши два типа, несмотря на одинаковое базовое имя, являются совершенно разными типами. В другом месте вашего кода вы не можете иметь переменную типа TFooType и произвольно решать, присваивать ли ей значения из обеих этих единиц. Переменная может содержать значения только из одного типа.

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

Ответ №2:

@Hrukai, как и в lego, вы многое можете сделать, но что-то просто не было разработано для такого использования.

Мне кажется, что ваша конечная цель — получить доступ к типу, а отправной точкой является имя переменной. Если бы вы реализовали свои переменные как классы (ООП), вы могли бы просто создать Obj.className, чтобы найти его тип… но также, если бы вы выбрали классы для своей реализации, я предсказываю, что эта необходимость (для доступа к типу из переменной) никогда бы не возникла в первую очередь.

Сопротивляйтесь желанию создать новый шаблон и вместо этого используйте возможности классов. http://www.delphibasics.co.uk/Article.asp?Name=OOExample

Ответ №3:

Лучшее, что вы могли бы сделать, было бы что-то вроде if name='Unit1' then T := Unit1.TFoo и т.д. Но что вы можете сделать с T в любом случае? Поскольку перечисленные типы из разных модулей различны, трудно представить, что с ними можно что-либо делать T . На самом деле, как бы вы вообще определили T ? Единственное, что я мог себе представить, было бы возможно, это вернуть информацию о типе, но сейчас я даю волю своему воображению!

Комментарии:

1. RTTI не имеет к этому никакого отношения. Смотрите ответ Роба — это два совершенно разных (и несовместимых) типа. Вам нужно было бы заранее знать, какой из них будет использоваться, чтобы вы могли объявить соответствующую переменную TFooType (например, var FT1: Unit1.TFooType; FT2: Unit2.TFooType; ).

2. @Ken да, я написал этот фрагмент до того, как обратил внимание на тот факт, что только классы могут поддерживать то, о чем я говорил.

3. NP. Не проголосовал против из-за первого предложения в вашем первоначальном ответе. 🙂