Spring 框架中是否有任何内置方法可以更轻松地使用多态容器?
Are there any methods built into the Spring framework that make working with polymorphic containers easier?
我有一个包含不同类型值的字典,我想过滤具有特定子类型且满足特定条件的项目:
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不支持接口中的参数化方法。
这就是为什么 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.
处理类时当然可以改进其MoveNext方法中的类型检查以避免TValue。
我有一个包含不同类型值的字典,我想过滤具有特定子类型且满足特定条件的项目:
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不支持接口中的参数化方法。
这就是为什么 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.
处理类时当然可以改进其MoveNext方法中的类型检查以避免TValue。