我在将列表传递给接受不同类型参数的方法时遇到问题。
我的命名空间中有以下方法: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'.
任何更好的方法来处理/设计它。
答案 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等