Generics: What's a “CONSTRUCTOR constraint”?

后端 未结 2 1816
轮回少年
轮回少年 2021-01-04 23:27

I made a custom TObjectList descendant designed to hold subclasses of a base object class. It looks something like this:

interface
   TMyDataList

        
2条回答
  •  逝去的感伤
    2021-01-04 23:59

    Just a quick update to an old question..

    You don't need the constructor constraint and can also do this on object's with parameters by using RTTI like this (using RTTI or System.RTTI with XE2)

    constructor TMyDataList.Create;
    var
      ctx: TRttiContext;
    begin
       inherited Create(true);
       self.Add(
         ctx.
         GetType(TClass(T)).
         GetMethod('create').
         Invoke(TClass(T),[]).AsType
       );
    end;
    

    If you have parameters, just add them like this

    constructor TMyDataList.Create;
    var
      ctx: TRttiContext;
    begin
       inherited Create(true);
       self.Add(
         ctx.
         GetType(TClass(T)).
         GetMethod('create').
         Invoke(TClass(T),[TValue.From('Test'),TValue.From(42)]).AsType
       );
    end;
    

提交回复
热议问题