13. juni 2008 - 15:27Der er
6 kommentarer og 1 løsning
Extension Methods - Problemer med List og interfaces..
Jeg ville forsøge mig med at lave en metode på List<> der gjorde, at jeg kunne konvertere et alm. serverobjekt om til et DataTransferObject, men jeg er rendt ind i lidt problemer nu. Det ser nemlig ud til, at listen jeg får retur ikke kan castes, og så ryger pointen lidt i det jeg gerne ville.
Her er lige lidt kode til at illustrere det:
public static List<IDataTransferObject> ConvertToDtoList<T>(this List<T> convertableList) where T : IHasConvertToDto { List<IDataTransferObject> dtoList = new List<IDataTransferObject>(); foreach(IHasConvertToDto convertable in convertableList) { dtoList.Add(convertable.ConvertToDto()); } return dtoList; }
public interface IDataTransferObject { //a tag for Dto classes. }
public interface IHasConvertToDto { IDataTransferObject ConvertToDto(); }
Så er det så meningen at jeg vil kalde en metode sådan her: List<News> news = //kode til at fylde listen.. List<NewsDto> newspair = news.ConvertToDto();
Problemet med dette er, at news.ConvertToDto returnerer en List<IDataTransferObject>, og den kan jeg ikke umiddelbart blot caste til en List<NewsDto>, selvom NewsDto implementerer det interface.
Grunden til at jeg gerne vil køre det med interfaces er, at jeg har flere klasser som der skal konverteres til dtoklasser, og så ville det jo være rarere blot at skrive én extension.
Ah, tak for Cast metoden, den kendte jeg ikke. Men hvordan performer den egentlig?
Og så prøvede jeg din første løsning, men jeg synes ikke det virkede. Jeg fik den her fejlmeddelelse:
Error 1 'System.Collections.Generic.List<DataHandler.Classes.News>' does not contain a definition for 'ConvertToDtoList' and no extension method 'ConvertToDtoList' accepting a first argument of type 'System.Collections.Generic.List<DataHandler.Classes.News>' could be found (are you missing a using directive or an assembly reference?) E:\Documents\Visual Studio 2008\Projects\AncientConflicts\DataHandler\Facade.cs 30 25 DataHandler
Her er lige den nye kode for en god ordens skyld: public static List<TResult> ConvertToDtoList<T,TResult>(this List<T> convertableList) where T : IHasConvertToDto where TResult : IDataTransferObject { List<TResult> dtoList = new List<TResult>(); foreach(T convertable in convertableList) { dtoList.Add((TResult)convertable.ConvertToDto()); } return dtoList; }
Det kan du tro, jeg lærte meget nyt der, takker.. :D
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.