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

时间:2011-05-12 17:08:27

标签: c# generics

我有一个界面,它看起来像下面的

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);

1 个答案:

答案 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);