DelphiXE泛型不能用类类型做为约束的另类解决方案

前天想写个泛型类,用来保存类类型(如TClass、TComponentClass之类)

但是DelphiXE的泛型约束不支持TClass

TClassList<T: TClass> 将会得到编译错误

因此我只能去掉约束条件 TClassList<T>

但是这样又有个问题,即 T 类型不明确,无法用 Assigned(T) 或 T <> nil 来判断值是否为空

后来想了个办法绕过了这个问题,详见代码

 

procedure TClassList<T>.Register(const ADisplayName: string; AClass: T);
var
  P: Pointer;
begin
  P := PPointer(@AClass)^;
  Assert(Assigned(P), 'Target class cannot be nil.');

  FClassList.AddObject(ADisplayName, P);
end;

function TClassList<T>.Find(const ADisplayName: stringout Value: T): Boolean;
var
  Index: Integer;
begin
  Assert(ADisplayName <> '''Display name cannot be blank.');

  Index := FClassList.IndexOf(ADisplayName);
  Result := Index >= 0;
  if Result then PPointer(@Value)^ := Pointer(FClassList.Objects[Index]);
end;

记录一下,免得忘记



看清这世界的美丽与残酷



NAILY Soft
Sephil on CNBlogs
原文地址:https://www.cnblogs.com/sephil/p/2673052.html