Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обобщения 
:(
    Опции темы
mullih
Дата 18.8.2008, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 19.12.2006

Репутация: нет
Всего: 2



Доброго времени суток.

известен тип, при компиляции не известны. 

Код

Type type = obj.GeType();


Необходимо создать Список и указатель. Примерно такого вид

Код

class c
 {
  private void CreateList(object obj)
  {
    IList<type> list = new List<type>();
    list.add((type)obj);
    if (ListEvent!=null)
      ListEvent(list);
  }

  public event ListHandler<type> ListEvent;
}

public delegate ListHandler<T>(IList<T> list);



Собственно вопрос что засунуть на место "type" во втором коде или как это по другому описать. Заранее "type" не известен. Класс из "class" c в "class c<T>" не хочу делать так как это контрол и в дизайнер после этого будет ругаться.  Obj создается с помощью отражения поэтому object просто обертка. На место "type" object не могу поставить т.к. от того что прийдет подписчику в <T> от события зависит дальнейшее поведение

Заранее благодарен за помощь

PM MAIL WWW Skype   Вверх
mihryak
Дата 19.8.2008, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Цитата(mullih @  19.8.2008,  00:33 Найти цитируемый пост)
Код

IList<type> list = new List<type>();

afaik, эта строчка в момент компиляции преобразуется в код, работающий с конкретным типом, т.е. дженерики - compile-time, а не run-time

посмотри сюда
PM MAIL ICQ   Вверх
QryStaL
Дата 19.8.2008, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 14
Всего: 32



Цитата(mihryak @  19.8.2008,  09:20 Найти цитируемый пост)
дженерики - compile-time, а не run-time

наоборот


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
mihryak
Дата 19.8.2008, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



QryStaL,
мм.... я вообще-то имел в виду то, что тип дженерика вбилдивается в код при компиляции
если пойти дальше, то под run-time я имел в виду уже прошедший через JIT код (некорректное использование термина, согласен) - где-то (если не ошибаюсь - RSDN) читал, что, например, List<int> после JIT'а представлен как простой массив целых чисел

а вообще тема весьма интересная
вот, спеку нашёл
PM MAIL ICQ   Вверх
QryStaL
Дата 19.8.2008, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 14
Всего: 32



Цитата(mihryak @  19.8.2008,  11:34 Найти цитируемый пост)
тип дженерика вбилдивается в код при компиляции

при JIT-компиляции, а это уже все-таки рантайм...


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
mihryak
Дата 19.8.2008, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Цитата(QryStaL @  19.8.2008,  12:42 Найти цитируемый пост)
при JIT-компиляции, а это уже все-таки рантайм... 

открой рефлектором код с джерериками - все типы будут проставлены
Код

L_0001: newobj instance void test.Program/Generic<int32>::.ctor(!0)

PM MAIL ICQ   Вверх
mullih
Дата 19.8.2008, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 19.12.2006

Репутация: нет
Всего: 2



Спасибо за помощь и вдогонку еще вопросик по этой же теме

Код

    public class C1
    {
        public virtual int Id { get; set; }
    }

    public abstract class Test<D> where D : C1
    {
        A a = new A();
        public void GetById()
        {
            var result = a.GetById<D>(D.Id); //
        }
    }



D.Id как правильно записать чтоб для любого объекта <D> типа наследуемого от С1 можно было использовать свойство Id?

ЗЫ есть подозрение что такого быть вообще не может без самого объекта но вдруг всетаки можно)

Это сообщение отредактировал(а) mullih - 19.8.2008, 15:09
PM MAIL WWW Skype   Вверх
nagg
Дата 19.8.2008, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 6.1.2008
Где: Minsk

Репутация: нет
Всего: 4



Ты б хоть строчку  where D : C1 - в комменты вознёс, а то я чуть глаза не поломал.
var result = a.GetById<D>(D.Id);
ты у типа пытаешься вызвать экземплярное свойство не создавая объект.
--------------------
I am the State...
PM MAIL WWW ICQ Skype   Вверх
mullih
Дата 19.8.2008, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 19.12.2006

Репутация: нет
Всего: 2



>var result = a.GetById<D>(D.Id);
>ты у типа пытаешься вызвать экземплярное свойство не создавая объект.

я об этом тоже подумал но потом )


>Ты б хоть строчку  where D : C1 - в комменты вознёс, а то я чуть глаза не поломал.

в вот как раз с это строчкой все в порядке 
Это ограничение. <D> может быть только типом С1 или его наследниками

PM MAIL WWW Skype   Вверх
source777
Дата 19.8.2008, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(mihryak @  19.8.2008,  11:48 Найти цитируемый пост)
открой рефлектором код с джерериками - все типы будут проставлены


mihryak, ты не понимаешь, что значит "в момент компиляции преобразуется в код, работающий с конкретным типом", обратись для разъяснения этого вопроса к шаблонам(templates) С++, вот там compile-time и для каждого параметра шаблона действительно компилятор создаст свой тип, в C# и List<int>, и List<string>, и List<char> - это один класс, в С++ в аналогичном случае будет _три_ разных класса.


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
mihryak
Дата 19.8.2008, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



source777, я выше пояснил
что класс один - не спорю, так и есть, и моя цитата из рефлектора тоже об этом говорит
написал её, чтобы показать, что не существует в IL'е такой штуки, как List<instanceOfSomeType.GetType()>, конкретный тип должен быть явно задан в коде
PM MAIL ICQ   Вверх
mullih
Дата 22.8.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 19.12.2006

Репутация: нет
Всего: 2



Вроде нашел решение моего топика

http://www.codeproject.com/KB/dotnet/Invok...ricMethods.aspx

Возможно не панацея от всех недуг но может быть комунибудь пригодится

Это сообщение отредактировал(а) mullih - 22.8.2008, 19:17
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0761 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.