最近我问了一个关于通过外键获取模型属性的更一般的问题。 现在我进一步移动了一点,但仍然不知道如何变换对象。将IEnumerable <T>转换为动态生成对象的集合
我有什么是IEnumerable
集合,我通过储备库中获得
regionRaw = unitOfWork.RegionRepository.Get(
keyOrder: q => q.OrderBy(d => d.RegionID),
filter: p => p.FullName.Contains(lastname) || p.ShortName.Contains(lastname),
orderBy: jtSorting,
includeProperties: "District, ISO31662, GOST767Region");
而且我将数据从这个集合导出到Excel中。所以我需要一个select语句来获取我需要的所有字段。
dt = regionRaw
.Select(x => new
{
ISO = x.ISO31662.GOSTName,
DistrictName = x.District.ShortName
})
我不想枚举我需要的所有字段在顶部。
我能够做出一个方法,以识别哪些字段具有简单的值,哪些具有通过外键引用的对象。然后该方法将返回一个属性列表。
现在我需要一些方法来写内部select
内。我看到这样的事情:
dt = regionRaw
.Select(x => new
{
foreach (prop in propList)
{
prop.PropertyName = x.GetType()
.GetProperty(prop.TableName)
.GetValue(x, null).GetType()
.GetProperty(prop.PropertyName)
.GetValue(
x.GetType().GetProperty(prop.TableName).GetValue(x, null),
null);
}
}
其中propList
是我以前得到的属性的集合。
我完全意识到上层代码更多的是伪代码,但我不知道如何在.NET中实现这一点。
因此,如果您可以为此任务提出一些解决方案,我将非常感激。或者,也许你可以解释,这一切都是一个坏主意,不应该被实现。
很多时候我遇到过这个问题。最终,我发现手动分配属性更容易,而不是回到使用Reflection或Automapper等映射实用程序。 – Oliver
我不太明白,但是,我怀疑使用反射动态地在已知类型上执行此操作可能是不好的。明确并在编译时得到你的错误。 – Jodrell