我正在尝试重构一些方法,以避免在对象映射中重复自己。这些功能在SO question中列出。
我有一个通用方法,它将调用4个存储过程之一,返回具有相同字段的结果,只是不同的数据子集。 linq2sql为每个存储过程生成不同的Result对象。
有没有办法将结果一般映射到我的服务器对象?它需要反思吗?
private static List<DistroHeader> getHeaders<T>(Func<IEnumerable<T>> getHeaders)
{
List<MyObj> myObj = new List<MyObj>();
var result = from a in getMyObjData()
select a;
foreach (var row in result)
{
myObj.Add(new MyObj()
{
Id = row.id,
Description = row.descr,
// ...etc
// These fields are shared across the result types...
// is there a way to make the compiler recognize that?
});
}
}
答案 0 :(得分:1)
linq将如下所示:
var result = from a in getMyObjData()
select new { Id = a.id, Description = a.description };
linq的一个很好的资源是101 Linq Samples。
修改强>
这取决于您的需求。以上是创建通用对象的一个非常简单的示例。
您可以在下面看到更好的答案,因为它实际上是在创建您需要的类型的对象。
MyObject newOject = from item in getMyObjData()
select new MyObject()
{
Id = item.Id,
Description = item.description
};
答案 1 :(得分:0)
我会考虑使用AutoMapper。
答案 2 :(得分:0)
我猜这不是好习惯,但这就是我所做的:
private static List<DistroHeader> getHeaders<T>(Func<IEnumerable<T>> getHeaders)
{
List<MyObj> myObj = new List<MyObj>();
var result = from a in getMyObjData()
select a;
var pi = new List<PropertyInfo>(typeof(T).GetProperties());
foreach (var row in result)
{
myObj.Add(new MyObj()
{
Id = (int)pi.Find(x => x.Name == "id").GetValue(row, null),
Description = (string)pi.Find(x => x.Name == "descr").GetValue(row, null),
// ...etc
});
}
}