如何仅指定要用作方法容器的 List 类型
本文关键字:List 类型 方法 何仅指 | 更新日期: 2023-09-27 17:56:21
我有一个界面,它看起来像下面
public interface IModelConverter<TSourceModel, TDestinationModel>
{
TListType ToDestination<TListType>(IEnumerable<TSourceModel> source)
where TListType : IList<TDestinationModel>, new();
TListType ToSource<TListType>(IEnumerable<TDestinationModel> source)
where TListType : IList<TSourceModel>, new();
TDestinationModel ToDestination(TSourceModel source);
TSourceModel ToSource(TDestinationModel source);
}
我希望能够以这样一种方式调用列表转换方法,这样我只需要指定列表类型,而不必在列表中包含包含的类型,因为它是从 interace 定义推断出来的。
前任:假设我创建了一个实现,使得
FooBooModelConverter : IModelConverter<Foo,Boo>
。稍后在我的代码中,我将其实例化为modelConverter,我想执行以下操作
BindingList<Foo> fooList = modelConverter<BindingList>.ToDestination(booList);
或
List<Foo> fooList = modelConverter<List>.ToDestination(booList);
但是,我必须执行以下操作
BindingList<Foo> fooList = modelConverter<BindingList<Foo>>.ToDestination(booList);
或
List<Foo> fooList = modelConverter<List<Foo>>.ToDestination(booList);
在列表类型中重新指定 Foo 是多余且丑陋的。
理想情况下,我很想执行以下操作,并让它通过返回值自动推断列表类型,但我会采取我能得到的。任何人?
BindingList<Foo> fooList = modelConverter.ToDestination(booList);
为什么要在转换器内构造列表?您可以返回一个IEnumerable<T>
并在外部构造列表:
public interface IModelConverter<TSourceModel, TDestinationModel>
{
IEnumerable<TDestinationModel> ToDestination(IEnumerable<TSourceModel> source);
IEnumerable<TDestinationModel>ToSource(IEnumerable<TDestinationModel> source);
//...
}
var fooList = new List<Foo>(modelConverter.ToDestination(booList);