gpt4 book ai didi

delphi - Spring 框架中是否有内置的方法可以使多态容器的使用变得更容易?

转载 作者:行者123 更新时间:2023-12-03 15:52:05 25 4
gpt4 key购买 nike

我有一个包含不同类型值的字典,我想过滤具有特定子类型且满足特定条件的项目:

var
FData: IDictionary<TGUID, TObject>; // Polymorphic
begin
TMicroStep(FData.Values.Single(
function(const O: TObject): Boolean begin
Result := (O is TMicroStep) and (TMicroStep(O).OrderTag = 1);
end))
end;

它可以工作,但由于类型检查和双重强制转换,它看起来很难看。

也许这样的事情是可能的?

var
FData: IDictionary<TGUID, TObject>; // Polymorphic
begin
FData.Values.SingleSubType<TMicroStep>(
function(const MS: TMicroStep): Boolean begin
Result := MS.OrderTag = 1;
end))
end;

Spring 有什么可以帮助我的吗?

最佳答案

不幸的是,Delphi 不支持接口(interface)中的参数化方法。这就是为什么IEnumerable<T>没有像 OfType<TResult> 这样的方法.

您可以使用我们在 TCollections 中提供的静态方法(或者使用 1.2 中的新静态类型 TEnumerable 提供这些方法)但我不知道您是否比现有的更喜欢它:

TEnumerable.OfType<TObject, TMicroStep>(FData.Values).Single(
function(const MS: TMicroStep): Boolean
begin
Result := MS.OrderTag = 1;
end);

该方法如下所示(未经测试,但应该有效):

class function TEnumerable.OfType<T, TResult>(
const source: IEnumerable<T>): IEnumerable<TResult>;
begin
Result := TOfTypeIterator<T, TResult>.Create(source);
end;

TOfTypeIterator<T,TResult>来自 Spring.Collections.Extensions。

在处理类时,其 MoveNext 方法中的类型检查当然可以改进以避免 TValue。

关于delphi - Spring 框架中是否有内置的方法可以使多态容器的使用变得更容易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28411408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com