【发布时间】:2014-10-16 03:58:44
【问题描述】:
我通过反射获取属性,我正在这样做以迭代列表。
private string HandleListProperty(object oldObject, object newObject, string difference, PropertyInfo prop)
{
var oldList = prop.GetValue(oldObject, null) as IList;
var newList = prop.GetValue(newObject, null) as IList;
if (prop.PropertyType == typeof(List<DataModel.ScheduleDetail>))
{
List<DataModel.ScheduleDetail> ScheduleDetailsOld = oldList as List<DataModel.ScheduleDetail>;
List<DataModel.ScheduleDetail> ScheduleDetailsNew = newList as List<DataModel.ScheduleDetail>;
var groupOldSchedules = ScheduleDetailsOld
.GroupBy(x => x.HomeHelpID)
.SelectMany(s => s.DistinctBy(d => d.HomeHelpID)
.Select(h => new { h.HomeHelpID, h.HomeHelpName }));
var groupNewSchedules = ScheduleDetailsNew
.GroupBy(x => x.HomeHelpID)
.SelectMany(s => s.DistinctBy(d => d.HomeHelpID)
.Select(h => new { h.HomeHelpID, h.HomeHelpName }));
var AddedHomeHelp = string.Join(",", groupNewSchedules
.Where(x => x.HomeHelpID != null && !groupOldSchedule
.Any(y => y.HomeHelpID == x.HomeHelpID))
.Select(x => "\"<strong>" + x.HomeHelpName + "\"</strong>"));
var RemovedHomeHelp = string.Join(",", groupOldSchedules
.Where(x => x.HomeHelpID != null && groupNewSchedules
.Any(y => y.HomeHelpID != x.HomeHelpID))
.Select(x => "\"<strong>"+x.HomeHelpName+"\"</strong>"));
difference += string.IsNullOrWhiteSpace(RemovedHomeHelp) ? string.Empty : "<strong>HomeHelp</strong> " + RemovedHomeHelp + " Removed<br/>";
difference += string.IsNullOrWhiteSpace(AddedHomeHelp) ? string.Empty : "<strong>HomeHelp</strong> " + AddedHomeHelp + "Added<br/>";
}
}
现在我把它变成通用的,因为会有不同类型的列表,我不想把如果条件这样我想写 处理任何类型列表的通用代码。
我想出了这个方法:
private void HandleListProperty(object oldObject, object newObject, string difference, PropertyInfo prop)
{
var oldList = prop.GetValue(oldObject, null) as IList;
var newList = prop.GetValue(newObject, null) as IList;
var ListType = prop.PropertyType;
var MyListInstance = Activator.CreateInstance(ListType);
MyListInstance = oldList;
}
我能够在MyListInstance 中获取项目,但由于类型将在运行时出现,我不知道如何编写 linq 查询来过滤它们,不知道该怎么做。
【问题讨论】:
-
请在格式化您的代码方面付出更多努力 - 目前很难阅读,到处都是缩进。
-
如果我理解你的问题是正确的,我会向这个方法传递一个委托函数来进行过滤。你的具体实现似乎做了非通用的事情,所以你不能真的把它留在那里。
-
@AndreasMüller 没明白你的意思,你能详细说明一下吗?
-
第一个问题:我认为您的所有列表都没有
HomeHelpId和HomeHelpName属性,是吗?如果没有,您也需要传递这些属性(属性名称)。 -
@RaphaëlAlthaus 当然
DataModel.ScheduleDetail有这些属性
标签: c# linq list generics reflection