如何仅指定要用作方法容器的 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);

如何仅指定要用作方法容器的 List 类型

为什么要在转换器内构造列表?您可以返回一个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);