将列表从一种类型转换为另一种类型

时间:2017-09-29 14:26:29

标签: c# generics

我在将列表传递给接受不同类型参数的方法时遇到问题。

我的命名空间中有以下方法:Common.DB2(One 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'.

任何更好的方法来处理/设计它。

4 个答案:

答案 0 :(得分:3)

两个模型之间的投射不会像这样工作。您的代码不知道如何将这两个模型相互映射。

你可以使用像AutoMapper这样的映射包,或者只创建一个在某些&#34; helper&#34;之间进行转换的方法。或者其他什么。

答案 1 :(得分: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

答案 2 :(得分:0)

嗯,他们是不同类型的,所以很难让运行时错误,因为它无法完成你想做的事情。

如果两种类型或多或少相同,那么您可以在它们之间编写转换方法并使用它们来转换集合:

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

如果您可以修改类型,您也可以提供转换运算符,但最终结果几乎相同。

答案 3 :(得分:0)

两个命名空间中的对象是否相同?如果是这样,您应该删除一个副本,并在其他类中引用名称空间。

如果他们不是同一个模型,您需要手动执行某种类型的转换 - 即创建目标模型的新副本然后映射它:SQL.MyModel.ID = DB2。 MyModel.ID等