为接受继承的集合类型的 ICollection 创建 ExtensionMethod
Create ExtensionMethod for ICollection accepting inherited collection types
我正在创建一个 class 可以接受泛型类型作为数据,如果是集合类型,我想创建一个用于在其中添加元素的扩展方法。到目前为止,我有以下扩展方法:
public ActionResponseBuilder<ICollection<TElement>> AddElement<TElement>(this ActionResponseBuilder<ICollection<TElement>> builder, TElement element)
{
//TODO Logic
return builder;
}
我对此的测试方法:
var data = DateTime.Now;
var builtActionResponse = new ActionResponseBuilder<List<DateTime>>()
.SetData(new List<DateTime> { data })
.AddElement(data)
.Build();
但是我遇到了以下错误:
Error CS1929 'ActionResponseBuilder>' does not contain a definition for 'AddElement' and the best extension method overload 'ActionResponseBuilderHelper.AddElement(ActionResponseBuilder>, DateTime)' requires a receiver of type 'ActionResponseBuilder>
如果我将扩展方法的类型更改为 List,它可以工作,但我想为此利用继承和泛型的强大功能,
我缺少什么,我可以这样做吗?有什么想法吗?
非常感谢您:)
PD: 这个东西是一个小的nuget工具的一部分,除了这个新的实现之外的所有代码都可以在下面找到GitHub存储库:
编辑:最初,扩展方法的名称被错误地复制了 AddData -> AddElement,感谢@Fabjan
您可以更改扩展方法以同时采用 T 和 TElement 并限制 T 以强制它成为 ICollection:
public static class Extensions
{
public static ActionResponseBuilder<T> AddData<T, TElement>(this ActionResponseBuilder<T> builder, TElement element) where T : ICollection<TElement>
{
// TODO: Logic
return builder;
}
}
现在你可以这样引用它了:
ActionResponseBuilder<List<DateTime>> builder = new ActionResponseBuilder<List<DateTime>>()
.AddData(DateTime.Now);
我正在创建一个 class 可以接受泛型类型作为数据,如果是集合类型,我想创建一个用于在其中添加元素的扩展方法。到目前为止,我有以下扩展方法:
public ActionResponseBuilder<ICollection<TElement>> AddElement<TElement>(this ActionResponseBuilder<ICollection<TElement>> builder, TElement element)
{
//TODO Logic
return builder;
}
我对此的测试方法:
var data = DateTime.Now;
var builtActionResponse = new ActionResponseBuilder<List<DateTime>>()
.SetData(new List<DateTime> { data })
.AddElement(data)
.Build();
但是我遇到了以下错误:
Error CS1929 'ActionResponseBuilder>' does not contain a definition for 'AddElement' and the best extension method overload 'ActionResponseBuilderHelper.AddElement(ActionResponseBuilder>, DateTime)' requires a receiver of type 'ActionResponseBuilder>
如果我将扩展方法的类型更改为 List,它可以工作,但我想为此利用继承和泛型的强大功能,
我缺少什么,我可以这样做吗?有什么想法吗?
非常感谢您:)
PD: 这个东西是一个小的nuget工具的一部分,除了这个新的实现之外的所有代码都可以在下面找到GitHub存储库:
编辑:最初,扩展方法的名称被错误地复制了 AddData -> AddElement,感谢@Fabjan
您可以更改扩展方法以同时采用 T 和 TElement 并限制 T 以强制它成为 ICollection:
public static class Extensions
{
public static ActionResponseBuilder<T> AddData<T, TElement>(this ActionResponseBuilder<T> builder, TElement element) where T : ICollection<TElement>
{
// TODO: Logic
return builder;
}
}
现在你可以这样引用它了:
ActionResponseBuilder<List<DateTime>> builder = new ActionResponseBuilder<List<DateTime>>()
.AddData(DateTime.Now);