【发布时间】:2015-06-17 07:18:34
【问题描述】:
我正在开发一个适用于多个类的组件。 为了允许添加托管类列表,我编写了一个 TCollection 的继承类,其中每个项目(从 TCollectionItem 继承)定义了一个已发布的“TargetClassName”属性。 “TargetClassName”属性的setter函数,调用下面的函数来找到对应的TClass:
function FindAnyClass(const Name: string): TClass;
var
ctx: TRttiContext;
typ: TRttiType;
list: TArray<TRttiType>;
begin
Result := nil;
ctx := TRttiContext.Create;
list := ctx.GetTypes;
for typ in list do
begin
if typ.IsInstance and (EndsText(Name, typ.Name)) then
begin
Result := typ.AsInstance.MetaClassType;
break;
end;
end;
ctx.Free;
end;
(感谢 Dalija Prasnikar 编写函数 Get class by its name in Delphi)。
现在,我想知道是否有更好的方法允许在设计时向 TCollectionItem 添加类。您对此有何看法? 希望阅读有趣的解决方案! 谢谢大家。
【问题讨论】:
-
RTTI 几乎肯定是错误的解决方案。
-
这就是我寻找更好解决方案的原因。目前,我没有找到任何其他在设计时添加类的方法。
-
如果没有更好地了解问题所在,我不会提出解决方案。就目前而言,您已经提出了解决方案,但并未真正描述问题。
-
在这种情况下,注册类的小列表可能是更好的选择。让每个所需的类在启动时自行注册,然后您可以在需要时遍历该列表。无论如何,这将在运行时起作用。在设计时,您可能必须编写一个自定义属性编辑器,枚举项目的单元,以查找具有共同祖先、实现共同接口或标记有共同属性等的类。
-
@David Heffernan:问题是我真的不知道在设计时设置 TClass 属性的任何明显方法。暴露出来的只是一个“后备解决方案”,它使用类名来获取 TClass。我想找到一个干净的解决方案。请告诉我哪一部分不清楚,我会尽力解释得更好。
标签: class delphi set design-time tcollectionitem