【问题标题】:Delphi: determine actual type of a generic?Delphi:确定泛型的实际类型?
【发布时间】:2009-11-19 03:27:43
【问题描述】:

有没有办法确定作为参数传递给方法的变量的类型?考虑类:

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-operator 不能像这样使用,但是有没有合法的替代方法可以满足我的要求?

【问题讨论】:

  • 如果您在泛型代码中做的第一件事是为每个可能的泛型值编写特定于类型的代码,那么您就不再编写泛型代码了。这不是使用泛型的地方。
  • 感谢 Rob 的输入。当我在 SO(和其他地方)发布问题时,我通常会想出我真实代码的简化版本。根据我的经验,提取问题的本质比呈现真实世界的代码更有用——代码通常要复杂得多。所以请考虑上面的代码说明一个更大的问题。顺便说一句:我很想了解上述代码的替代方案。请查看我的后续问题:stackoverflow.com/questions/1761487/…。我期待着对该帖子的任何意见! :)

标签: delphi generics


【解决方案1】:

此处无法使用 is 运算符是一个已知问题,但有一个非常简单的解决方法。

  if TObject(Element) is TInt then
    List.AddElement(TInt.Create(XXX))

此外,由于泛型的类型是类的一部分并且在编译时已知,因此您最好重组代码。创建两个不同的泛型类,其中一个接受 TInt 作为其&lt;T&gt; 参数,另一个接受 TString。在该级别将特定类型的功能放入它们中,并让它们从一个共同的祖先继承下来以实现共享功能。

【讨论】:

  • 谢谢梅森!但是,我收到“E2089 无效类型转换”错误。你知道为什么吗?我在上一篇文章中可能还不清楚,但 TInt 和 TString 都源自 TDataType,但它们在 TInt 和 TString 级别(特别是它们的构造函数)上有所不同。这就是你的意思,对吧?无论如何 - 约束尽可能“接近” TInt 和 TString 以确保最佳功能。
  • 你在哪一行得到错误?我没有要测试的代码,但我编写了一个简单的测试并转换为 TObject 对我来说很好......
  • 在我原来的帖子中,我正在处理一个更复杂的设计,但给出了上面给出的示例,因为它抓住了我遇到的基本问题。因此,当被要求提供整个源代码时,我不得不从“零开始”对其进行编码。它看起来有点不同,但我仍然遇到类型转换问题。我应该将其作为单独的问题发布,还是作为对您帖子的回答?
  • 最好将其作为一个单独的问题发布。但请记住 Rob Kennedy 在上面的评论中所写的内容。他的观点很好。
  • 谢谢梅森。我昨天不得不跑,所以这就是延迟的原因……我评论了 Rob 的评论(连同指向新帖子的链接)。我确信 Rob 有一个观点,我很想就此事获得一些反馈。你认为什么时候使用泛型有意义? TInt 和 TStr 示例只是两种特定的数据类型。想象一下,您还有 15-20 个其他人……我相信这构成了对泛型的合理使用。你怎么看?
【解决方案2】:

这个问题我前段时间问过

Conditional behaviour based on concrete type for generic class

可能会很有趣,尤其是如果您不仅想在条件句中使用 TObject 后代而且还想使用原始类型。

【讨论】:

  • +1 您节省了我的时间,因为我需要链接的答案来启用枚举类型的通用转换功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2017-06-07
  • 2018-08-18
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
相关资源
最近更新 更多