Доступ к свойствам обезличенного generic-класса
От: dfbag7 Россия  
Дата: 07.12.07 06:04
Оценка:
Задача следующая. Имеется DataDridView, в которой в ячейках одной из колонок лежат объекты. Каждый из этих объектов реализует интерфейс ICollection<T>, но T может быть разным. Например, один из объектов реализует ICollection<Contract>, другой — ICollection<Client>, и т.п. Мне нужно получить значение свойства Count каждого из этих объектов.

Я написал такую функцию:
/// <summary>
/// Возвращает значение свойства Count любого объекта, реализующего интерфейс ICollection{T}.
/// </summary>
/// <param name="aContainer">Любой объект, реализующий ICollection{T}</param>
/// <returns>Значение свойства Count</returns>
private static int GetCount(object aContainer)
{
   Type type = aContainer.GetType();
   foreach(Type iface in type.GetInterfaces())
   {
      if(iface.IsGenericType && iface.GetGenericTypeDefinition() == typeof(ICollection<>))
      {
         return (int)type.GetProperty("Count").GetValue(aContainer, null);
      }
   }

   throw new ArgumentException("Argument doesn't support ICollection<>", "aContainer");
}

Это решение мне не нравится, так как использует reflection и, по всей видимости, в некоторых редких случаях работать не будет.
Есть ли какое-нибудь решение, не использующее reflection?
Re: Доступ к свойствам обезличенного generic-класса
От: den123 Израиль http://den123.smugmug.com
Дата: 07.12.07 06:13
Оценка:
Здравствуйте, dfbag7, Вы писали:

...

А нельзя сделать классы Т, классами, реализующими некий интерфейс, у которого есть метод Count? Тогда все можно делать обычным путем, без reflection.
WBR — Yuriy
Re[2]: Доступ к свойствам обезличенного generic-класса
От: dfbag7 Россия  
Дата: 07.12.07 06:20
Оценка: :)
Здравствуйте, den123, Вы писали:

А нельзя сделать классы Т, классами, реализующими некий интерфейс, у которого есть метод Count? Тогда все можно делать обычным путем, без reflection.


Не хочется плодить сущности без необходимости...
Re[3]: Доступ к свойствам обезличенного generic-класса
От: OrSol  
Дата: 07.12.07 07:17
Оценка: +1
Здравствуйте, dfbag7, Вы писали:

D>Здравствуйте, den123, Вы писали:


D>

А нельзя сделать классы Т, классами, реализующими некий интерфейс, у которого есть метод Count? Тогда все можно делать обычным путем, без reflection.


D>Не хочется плодить сущности без необходимости...

у Вас как раз возникла необходимость наплодить сущность.
... << RSDN@Home 1.2.0 alpha rev. 729>>
Re: Доступ к свойствам обезличенного generic-класса
От: BluntBlind  
Дата: 07.12.07 07:27
Оценка:
Здравствуйте, dfbag7, Вы писали:

D>Задача следующая. Имеется DataDridView, в которой в ячейках одной из колонок лежат объекты. Каждый из этих объектов реализует интерфейс ICollection<T>, но T может быть разным. Например, один из объектов реализует ICollection<Contract>, другой — ICollection<Client>, и т.п. Мне нужно получить значение свойства Count каждого из этих объектов.

...
D>Это решение мне не нравится, так как использует reflection и, по всей видимости, в некоторых редких случаях работать не будет.
D>Есть ли какое-нибудь решение, не использующее reflection?

1. А эти объекты случаем не реализуют также интерфейс ICollection (Не генерик)?
2. Если есть возможность, может стоит у всех этих объектов также реализовать ICollection.


PS Странно конечно, что ICollection<T> не унаследован от ICollection, как в случае IEnumerable<T> : IEnumerable.
Re: Доступ к свойствам обезличенного generic-класса
От: dfbag7 Россия  
Дата: 07.12.07 08:29
Оценка:

Задача следующая.
...


Думаю, следует уточнить задачу. Дело в том, что речь идет об объектах, которые являются вложенными коллекциями NHibernate. На самом деле они реализуют интерфейс Iesi.Collections.Generic.ISet<T> (и через него — ICollection<T>). Непосредственно и просто влиять на тип этого объекта я не могу — его мне дает NHibernate.
Re[2]: Доступ к свойствам обезличенного generic-класса
От: Ziaw Россия  
Дата: 07.12.07 14:56
Оценка:
Здравствуйте, dfbag7, Вы писали:

D>

Задача следующая.
D>...


D>Думаю, следует уточнить задачу. Дело в том, что речь идет об объектах, которые являются вложенными коллекциями NHibernate. На самом деле они реализуют интерфейс Iesi.Collections.Generic.ISet<T> (и через него — ICollection<T>). Непосредственно и просто влиять на тип этого объекта я не могу — его мне дает NHibernate.

Generic коллекции NHibernate реализуют обычный ICollection
... << RSDN@Home 1.2.0 alpha rev. 786>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.