2017-09-13 9 views
-1

クラスAのリストを返すメソッドがありますが、同じプロパティを持つ別のクラスのリストを格納していますので、 。C# - あるクラスのリストを同じプロパティを持つ別のクラスのリストに変換する

コード:

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 
} 

種類のメニューとメニュー2の両方が同じ性質を持っています。 要件のために、別のMenu2タイプのリストとして返す必要があります。 上記のコードでは、CacheMenuListがMenu2型であるため、CacheMenuListを返すことができません。私はそれを行うことができる他の方法はありますか?次のエラーが表示されます。

暗黙的に型 '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アクティブ

+2

'Menu'タイプの各オブジェクトを' Menu2'にキャストまたは変換する必要があります。一方的な方法として "automapper"をチェックするか、それを行うためのコードを書いてください。 –

答えて

1

は、ここでそれを行うための一つの方法です:

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

あなたは基本的にそれぞれのMenu2オブジェクトを作成しますMenuオブジェクトはList<Menu>です。各Menuプロパティを対応するプロパティMenu2に割り当てます。

+0

List

を別の関数でnullにしているため、これを行うことはできません。エラーが発生しているため、値はnullにはなりません。パラメータ名:source。私はそれをやることができるかどうかを試しています –

3

この場合、優れたライブラリAutomapperを使用することをお勧めします。これは、属性がまったく同じ場合は特に簡単です。

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

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

プロパティは1マッピングしない場合:お互いに対して1を、あなたはマッパーを初期化するときの設定を調整する必要がある。ここ最小限の実施例です。

オートマッパーの詳細については、hereとマッピングコレクションhereを参照してください。

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

またはそれに類するもの。

関連する問題