Avatar billede johny Nybegynder
13. juni 2008 - 15:27 Der 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.

Nogen gode forslag til hvordan jeg løser det?
Avatar billede driis Nybegynder
13. juni 2008 - 18:41 #1
Brug 2 typeparametre:

public static List<TResult> ConvertToDtoList<T,TResult>(this List<T> convertableList)
Avatar billede driis Nybegynder
13. juni 2008 - 18:43 #2
Eller hvis problemet er at du skal have fat i dine NewsDto objekter senere, kan du bruge extension method Cast:

foreach(var news in list.Cast<NewsDto>())
{ /* your code */ }
Avatar billede johny Nybegynder
14. juni 2008 - 11:44 #3
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;
}
Avatar billede driis Nybegynder
14. juni 2008 - 17:08 #4
Du er nok nødt til at angive typeparametrene explicit når du kalder metoden. Ellers ved compileren ikke, hvad TResult er.
Avatar billede johny Nybegynder
14. juni 2008 - 17:23 #5
Ahh, det vidste jeg ikke at man kunne. Så virker det, takker.. :D

Smid et svar..
Avatar billede driis Nybegynder
14. juni 2008 - 18:06 #6
Svar - håber du kunne bruge det.
Avatar billede johny Nybegynder
14. juni 2008 - 18:47 #7
Det kan du tro, jeg lærte meget nyt der, takker.. :D
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



Seneste spørgsmål Seneste aktivitet
I dag 10:28 PDFEngine Af barth i Andet software
I går 22:40 Butte indhold i celler Af lurup i Excel
I går 15:24 Power Query Af djsimonsen i Excel
I går 14:43 Hvis ikke på liste, tilføj værdier til liste Af TheLibrarian i Excel
I går 11:33 Windows 11 Af ranni i Windows