3

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

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有什么可以帮助我的吗?

4

1 回答 1

4

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

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

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。

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

于 2015-02-09T21:25:28.417 回答