Работа с хеш-таблицей неизвестных, но похожих объектов (C #) - PullRequest
4 голосов
/ 09 мая 2009

У меня есть хеш-таблица, которая может содержать любое количество объектов. Все эти объекты реализуют некоторые похожие методы / свойства, а некоторые свои.

Например, все объекты в хеш-таблице могут иметь метод PrintText, принимающий один параметр типа string. Однако все объекты создаются из разных классов.

Можно ли мне извлечь конкретный объект из хеш-таблицы по его ключу, не зная его типа до времени выполнения, и получить доступ ко всем его собственным методам и свойствам (не только к обычным)?

Обычно я бы сделал что-то вроде

MyClass TheObject = MyHashTable [Key];

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

Ответы [ 4 ]

9 голосов
/ 09 мая 2009

Вы можете определить интерфейс, содержащий общие методы и свойства, и реализовать этот интерфейс во всех ваших классах. Тогда вы можете легко получить доступ к этим методам и свойствам.

Но для доступа к определенным методам объекта (не содержащимся в интерфейсе) вам необходимо знать тип объекта.

Обновление:

Из вашего вопроса не ясно, но когда вы пишете о хеш-таблице, я предполагаю, что вы имеете в виду класс хеш-таблицы . В этом случае вам следует взглянуть на универсальный класс Dictionary (доступен с .NET 2.0). Этот класс сделает ваш код безопасным для типов и избавит вас от большого количества приведения типов, например:

IMyInterface a = new MyObject();

// with Hashtable
Hashtable ht = new Hashtable();
ht.Add("key", a);
IMyInterface b = (IMyInterface)ht["key"];

// with Dictionary
var dic = new Dictionary<string, IMyInterface>();
dic.Add("key", a);
 // no cast required, value objects are of type IMyInterface :
IMyInterface c = dic["key"];
1 голос
/ 09 мая 2009

динамическое в C # 4. Отражение в более ранних версиях.

РЕДАКТИРОВАТЬ: В некоторых случаях определение общего интерфейса может быть эффективным и понятным способом достижения чего-то такого, что вы описываете. («Вдохновленный» принятым ответом и / или другими, упомянувшими его - не помню временной график)

1 голос
/ 09 мая 2009

Чтобы решить проблемы с общими методами и свойствами, вы можете решить, сделав ваши классы для реализации того же интерфейса. Тем не менее, я не вижу, как вы можете получить доступ к необычным участникам. Вы можете попробовать использовать Reflection.

0 голосов
/ 09 мая 2009

Вы можете сказать:

object theObject = MyHashTable[Key];

Тогда вы можете сказать:

theObject.GetType()
  .GetMethod("PrintText")
  .Invoke(theObject, new object[] {"paramvalue"});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...