我有一个界面,它看起来像下面的
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);
答案 0 :(得分:1)
为什么要在转换器中构建列表?您可以返回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);