2011-05-12 14 views
0

我有一個接口使用,它看起來像下面如何指定只列出類型爲您的容器上的方法

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

Respecifying富列表中的類型是多餘的,難看。

最好我喜歡做下面的事情,讓它自動通過返回值來推斷列表類型,但我會盡我所能。任何人?

BindingList<Foo> fooList = modelConverter.ToDestination(booList); 

回答

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); 
相關問題