有没有办法确定作为方法参数传递的变量的类型?考虑上课:
TSomeClass = class
procedure AddToList<T: TDataType; U: TListClass<T>>(Element: T; List: U);
end;
使用方法实现
procedure TSomeClass.AddToList<T, U>(Element: T; List: U);
begin
if Element is TInt then
List.AddElement(TInt.Create(XXX))
else if Element is TString then
List.AddElement(TString.Create(YYY));
end;
其中TInt.Create()和TString.Create()具有不同的参数集,但它们都从TDataType继承。
现在,我知道is
- 运算符不能像这样使用,但是有没有合法的替代方法来做我在这里要求的内容?
答案 0 :(得分:5)
此处无法使用是运算符是一个已知问题,但有一个非常简单的解决方法。
if TObject(Element) is TInt then
List.AddElement(TInt.Create(XXX))
此外,由于泛型的类型是类的一部分并且在编译时是已知的,因此您可能最好重构代码。创建两个不同的泛型类,其中一个接受TInt作为其<T>
参数,另一个接受TString。在特定级别将特定于类型的功能放入其中,并让它们从共同的祖先下载以获得共享功能。
答案 1 :(得分:4)
我前段时间问过这个问题
Conditional behaviour based on concrete type for generic class
可能会引起人们的兴趣,特别是如果您不仅要在条件句中使用TObject
个后代,还要使用原始类型。