2017-09-29 119 views
0

我在傳遞列表中遇到了接受不同類型參數的方法中的問題。從一種類型到另一種類型的列表清單

我有我的名字空間下面的方法:Common.DB2(一個classlibrary)

public List<MyModel> GetDB2Data() 
{ 
//Get data from db2 
} 

凡爲MyModel屬於Common.Db2命名空間

我有我的名字空間Common.Sql另一種方法(另一個Classlibrary)

public void PostToSql(List<MyModel> listData) 
{ 
//Post data to sql 
} 

凡爲MyModel屬於Common.Sql命名空間

所以基本上我從我的db2中獲取一些數據並將其發佈到sql。

在另一個類庫我得到這個數據和後數據爲:

//Get Data 
var data = db2Repo.GetDB2Data(); 

//Post Data 
sqlRepo.PostToSql(data); 

在這裏,在上面一行失敗,說明

Argument 1: cannot convert from 
    'System.Collections.Generic.List<Common.DB2.MyModel>' to 
    'System.Collections.Generic.List<Common.Sql.MyModel>' 

我曾試圖鑄造象下面這樣:

List<Common.Sql.MyModel> sourceList = new List<Common.Sql.MyModel>(); 
sourceList = data.Cast<Common.Sql.MyModel>().ToList(); 

但上面再次拋出異常

Unable to cast object of type 'Common.DB2.MyModel' to type 
'Common.Sql.MyModel'. 

什麼更好的辦法來處理/設計這一點。

+2

那麼你怎麼指望* *它從'Common.Db2.MyModel'到'Common.Sql.MyModel'轉換?你們沒有向我們展示任何有關這些課程的任何信息。 –

+2

您需要創建一種類型的MyModel並將其移至常見位置,並且共享位置的Common.Sql和Common.DB2引用,而不是每個具有其自己版本的MyModel的類。 – Hack

+0

這兩個類中的任何一個是否具有隱式/顯式運算符用於投射? –

回答

2

如果你想使用.Cast方法,你需要實現鑄造操作符。你可以查看如何在這裏做。 How do I provide custom cast support for my class?

或者您可以使用.Select方法執行此操作,但您需要自行初始化每個對象。

//Get Data 
var data = db2Repo.GetDB2Data(); 

var sqlData = data.Select(x => 
    new Common.Sql.MyModel(){ 
    // Do your mapping here 
    }); 

//Post Data 
sqlRepo.PostToSql(sqlData); 

我對於這種情況建議:如果這些模型是您的域的一部分,在創建只要您的架構告訴你這樣做的映射。否則,只需創建構造函數來執行映射。

您可以詳細瞭解。選擇在這裏: https://msdn.microsoft.com/en-us/library/bb548891(v=vs.110).aspx

+0

感謝這一個現在工作得很好。如上所示,是否有使用select方法和初始化每個對象的開銷。 – user1563677

+1

不,它基本上是一個foreach,在每次迭代中運行lambda表達式。 –

+0

謝謝。 – user1563677

3

兩個模型之間的鑄造不會像這樣工作。你的代碼不知道如何將這兩個模型映射到對方。

你可以使用一些映射包像AutoMapper爲,或者只是建立在一些「幫手」或任何在兩者之間轉換的方法。

0

那麼,他們是不同類型的,所以很難故障不這樣做你想要的運行,因爲它無法做到的。

如果兩種類型都或多或少相同的,那麼你可以寫他們之間的轉換方法,並用它們來集合轉換:

var sourceList = data.Select(Conversions.Db2ToSqlModel).ToList(); 

如果你可以修改的類型,你也可以提供轉換操作符,但最終結果幾乎相同。

0

兩個名稱空間中的對象是否相同?如果是這樣,你應該刪除一個副本,並簡單地引用其他類中的命名空間。

如果它們不是相同的模型,則需要手動執行某種類型的轉換 - 即創建目標模型的新副本,然後映射它:SQL.MyModel.ID = DB2.MyModel.ID etc

相關問題