Вопрос о рефлексии

Hug
Дата: 05.01.2010 23:27:52
Всем, добрый вечер.
Встала задача динамически создать генерик и поработать с ним.
Создаю List<T>, а вот как с ним поработать не пойму.

private void SelectRowAtGrid(Type dicType, int idEntity)
{
            Type typeList = typeof (List<>);
            Type typeGenList = typeList.MakeGenericType(dicType);
            object list = Activator.CreateInstance(typeGenList);
            list = dgvDicQuantity.DataSource;
            if (list != null)
            {
                int idx = list.FindIndex(delegate(Type s) { return s.Id == idEntity; });
                ....
            }
}
Как теперь вызвать у list метод FindIndex. Опять рефлексей?
Как получить объект s для делегата поиска?
Где-то в степи
Дата: 05.01.2010 23:51:56
Hug,

чет ниче не понял, но всеравно по сморите
 private void SelectRowAtGrid<T>(int idEntity) where T : class
        {
            List<T> list = new List<T>();
            int i = list.IndexOf(list.Single(a => a.GetHashCode() == idEntity));

        }
МСУ
Дата: 06.01.2010 00:00:48
А если уж и рефлексия, то делайте кастинг к IList:

var list = Activator.CreateInstance(typeGenList) as IList;

и обращайтесь к данным через неуниверсальную коллекцию объектов с индивидуальным доступом, осуществляемым при помощи индекса.
Где-то в степи
Дата: 06.01.2010 00:10:24
Hug,

а ваще зачем тут рефлексия, обращайтесь к дадасурсу напрямую
as к листу .
У вас куча типов с Id?
выделите в них интерфейс id и вместо class пишите my interface
where T : MyInterface
Hug
Дата: 06.01.2010 12:30:26
Спасибо за ответы!
Дело в том, что я перешел на NHibernate (Спасибо большое МСУ!!!!!).
И теперь имею дело только с типизированными коллекциями, репозиториями.

Сейчас делаются формы для работы со справочниками:

Справочники устроены так:

namespace Pharm.Core.Domain
{
    public class DicDomain
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public DicDomain() { }
    }
    public class PrepDosage : DicDomain
    {
        public PrepDosage() { }
    }
    public class SynPrepDosage : DicDomain
    {
        public virtual PrepDosage PrepDosage { get; set; }
        public SynPrepDosage() { }
    }
}

Теперь проблема как теперь на лету создавать типизированные объекты.
По вашему совету переделал
private int GetIdx<T>(Type typeDic,int idEntity) where T : DicDomain
{
            var list= GetDicGridByType(typeDic).DataSource as List<T>;
            if (list != null)
                return list.FindIndex(s => s.Id == idEntity);
            else
                return -1;
}
Есть класс
     class Repository<T>

Проблем в том, что я тип T не знаю заранее. А знаю только Type.
Как я должен вызывать GetIdx, создавать Репозитории если есть только Type?
Разве не рефлексией?
МСУ
Дата: 06.01.2010 13:07:06
Hug

Проблем в том, что я тип T не знаю заранее. А знаю только Type.
Как я должен вызывать GetIdx, создавать Репозитории если есть только Type?
Разве не рефлексией?

Так сам паттерн репозиторий и должен подразумевать, что тип T должен быть известен на этапе компиляции. Я же Вам уже приводил пример тут.
А, вообще, логике типа "SelectRowAtGrid" делать в репозитории нечего.

P.S. Что-то Вы намудрили нереальное :)
P.S2. А на ответы нужно "отвечать"...
Hug
Дата: 06.01.2010 13:21:32
МСУ
Hug

Проблем в том, что я тип T не знаю заранее. А знаю только Type.
Как я должен вызывать GetIdx, создавать Репозитории если есть только Type?
Разве не рефлексией?

Так сам паттерн репозиторий и должен подразумевать, что тип T должен быть известен на этапе компиляции. Я же Вам уже приводил пример тут.
А, вообще, логике типа "SelectRowAtGrid" делать в репозитории нечего.

P.S. Что-то Вы намудрили нереальное :)
P.S2. А на ответы нужно "отвечать"...


Вы правы. SelectRowAtGrid - это не логика репозитория, это просто метод формы.
Делаю winForm приложение, которое читает wcf сервис, который выдает справочные данные вразброс
Оператор сидит и выставляет справочники- это бренд, это название, это дозировка и т.д.
Вот и встает задача формировать Dic<T>, который уже внутри себя работает с Repository<T>
Грид - это чисто гуевая штука. И она мне не сильно критична.
Но вот Dic<T> я бы хотел уметь формировать на лету.

ЗЫ Извините, упустил ту тему из виду. Сам в конце концов пришел к Вашему выводу. Просто в Delphi немного по другому это было. Я оттуда притопал

ЗЫЫ Рад, что Вы вновь отвечаете:)
SeVa
Дата: 06.01.2010 13:27:26
МСУ
Hug

Проблем в том, что я тип T не знаю заранее. А знаю только Type.
Как я должен вызывать GetIdx, создавать Репозитории если есть только Type?
Разве не рефлексией?

Так сам паттерн репозиторий и должен подразумевать, что тип T должен быть известен на этапе компиляции. Я же Вам уже приводил пример тут.
А, вообще, логике типа "SelectRowAtGrid" делать в репозитории нечего.

P.S. Что-то Вы намудрили нереальное :)
P.S2. А на ответы нужно "отвечать"...


Пример лучше посмотреть здесь

"Слегка модифицированный вариант" совершенно не пригоден для тестирования и DI контейнеров.
Должен быть интерфейс IRepository, а не класс
Где-то в степи
Дата: 06.01.2010 18:03:50
Hug,

Ваще не поиму, что за машину вы строите.
потрудитесь на пальцах обьяснить какая задача стоит.
я только понял что выдаются справочники одной кучей.
автор
Проблем в том, что я тип T не знаю заранее. А знаю только Type.

а это что? -where T : DicDomain
Не въехав в ваши потребности, интуитивно догадываюсь что сева прав
МСУ
Дата: 06.01.2010 20:00:51
SeVa
"Слегка модифицированный вариант" совершенно не пригоден для тестирования и DI контейнеров.
Должен быть интерфейс IRepository, а не класс

1. Не умничай, интерфейсы идут уже от унаследованных репозиториев, а базовый класс репозитория - он и в африке базовыйю
2. Что именно "совершенно не пригодно для тестирования и DI контейнеров"? Давай по делу, пустозвонство оставь в своей тупой башке, лады?