2017-09-13 10 views
-1

Je possède une méthode pour retourner une liste de classe A. Mais je stocke la liste d'une autre classe avec les mêmes propriétés et j'ai besoin de retourner cette classe .C# -Convertir une liste d'une classe à la liste d'une autre classe avec les mêmes propriétés

code:

public List<Menu> GetAllMenus() 
{ 
    Menu _menu = null; 
    List<Menu> MenuList = new List<Menu>(); 
    List<Menu2> CacheMenuList=new List<Menu2>(); 
    //Caching 
    string CacheKey = "GetAllMenus"; 
    ObjectCache cache = MemoryCache.Default; 
    if (cache.Contains(CacheKey)) 
     CacheMenuList= (List<Menu2>)cache.Get(CacheKey); 
    return CacheMenuList 
} 

Les deux types Menu et Menu2 ont les mêmes propriétés. En raison de l'exigence, j'ai besoin de le retourner comme une autre liste de type Menu2. Dans le code ci-dessus ne suis pas capable de retourner le CacheMenuList puisqu'il est de type Menu2. Y a-t-il un autre moyen de le faire? Je reçois l'erreur suivante.

Impossible de convertir implicitement le type 'System.Collections.Generic.List < DailyThanthi.Contracts.Menu2>' à 'System.Collections.Generic.List < DailyThanthi.Contracts.Menu>' DailyThanthi.Repository D: \ Prjct \ DTNewsRevamp \ DailyThanthi.Common \ DailyThanthi.Repository \ MenuRepository.cs 85 actif

+2

Vous devrez convertir ou convertir chaque objet de type 'Menu' en' Menu2'. Vérifiez "automapper" comme un moyen, ou écrivez simplement du code pour le faire. –

Répondre

1

est ici une façon de le faire:

CacheMenuList= ((List<Menu>)cache.Get(CacheKey)).Select(
    x => new Menu2() { 
     Property1 = x.Property1, 
     Property2 = x.Property2, 
     Property3 = x.Property3, 
     Property4 = x.Property4 
    } 
).ToList(); 

Vous créez essentiellement un objet Menu2 pour chaque Menu objet dans List<Menu>. Vous affectez chaque propriété Menu à la propriété correspondante dans Menu2.

+0

Je ne peux pas faire cela parce que je fais la liste

comme nulle dans une autre fonction. En raison de cela, l'erreur Value ne peut pas être nulle. Nom du paramètre: source. donc j'essaie si de toute façon je peux le faire –

3

Je suggère d'utiliser l'excellente bibliothèque Automapper pour cela, ce qui devrait être particulièrement facile si les attributs sont exactement les mêmes. Voici un exemple de travail minimal:

Mapper.Initialize(cfg => cfg.CreateMap<Menu, Menu2>()); 

List<Destination> cacheMenuList = Mapper.Map<List<Menu>, List<Menu2>>(sources); 

Si les propriétés ne correspondent pas 1: 1 contre l'autre, vous devez ajuster la configuration lors de l'initialisation du mappeur.

En savoir plus sur Automapper en général here et sur la cartographie des collections here. Que diriez-vous de créer une interface et de retourner une liste de cela?

1

public interface IMenu { ... } 

public class Menu : IMenu { ... } 

public class Menu2 : IMenu { ... } 


public List<IMenu> GetAllMenus() 
    { 
     List<IMenu> result = new List<Menu>(); 
     //Caching 
     string CacheKey = "GetAllMenus"; 
     ObjectCache cache = MemoryCache.Default; 
     if (cache.Contains(CacheKey)) 
      result= (List<IMenu>)cache.Get(CacheKey); 
      return result; 
} 

Ou quelque chose de similaire.