Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.192.75.131] |
|
Сообщ.
#1
,
|
|
|
type TTest = record public class procedure Test<T>();static; // важно, нету констрейнта T: class end; class procedure TTest.Test<T>(); var Cl: TClass; begin Assert(PTypeInfo(TypeInfo(T)).Kind = tkClass); // как из T вытянуть ссылку на класс (TClass) ? end; |
Сообщ.
#2
,
|
|
|
jack128, а GetTypeData к PTypeInfo можно применить? Если да, то из PTypeData и вытянуть
|
Сообщ.
#3
,
|
|
|
ага, уже допер, сенкс
Добавлено Кста, связанный вопрос появился: type TTest = record public class procedure Test<T>();static; class procedure Test2<T: class>();static; end; class procedure TTest.Test<T>(); begin Assert(PTypeInfo(TypeInfo(T)).Kind = tkClass); // как вызывать Test2<T> ??? end; |
Сообщ.
#4
,
|
|
|
никак. дженерики собираются на стадии компиляции и не подлежат дальнейшей модификации. из за чего на их нельзя применять к методам интерфейса (а жаль).
а какую проблему пытаешься решить? может что посоветую. я просто применяю часто шаблоны. уж очень большой у их потенциал. но если бы их еще немного расширить то было бы вообще здоров )) Добавлено у меня что то подобное есть. но оно в обратную сторону. из шаблонной функции вызванивается одноиоменная обычная TSessionQuery = class abstract(TInterfacedObject) function Get(AClass: TSessionQueryClass): ISessionQuery; overload; function Get<I: ISessionQuery>(AClass: TSessionQueryClass): I; overload; end; function TSessionQuery.Get(AClass: TSessionQueryClass): ISessionQuery; begin Result := AClass.Create(self); end; function TSessionQuery.Get<I>(AClass: TSessionQueryClass): I; var pinfo: PTypeInfo; begin Result := Default(I); pinfo:=TypeInfo(I); if pinfo <> nil then Get(AClass).QueryInterface(GetTypeData(pinfo).Guid, Result); end; |
Сообщ.
#5
,
|
|
|
У меня после долгих поисков в google получилось примерно так:
type TMyObjClass = class of TMyObj; TMyObjList<T: TMyObj> = class .. function TMyObjList<T>.Add: T; var C: TMyObjClass; begin c := T; result := C.Create as T; FItems.Add(result); end; |