【发布时间】:2014-02-27 23:08:58
【问题描述】:
最近我问了一个关于通过外键获取模型属性的更一般的问题。 现在我移动了一点,但仍然不知道如何动态变换对象。
我得到的是一个 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 中写出类似foreach 的内容。我看到这样的东西:
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 中实现这一点。
因此,如果您能为这项任务提出一些解决方案,我将不胜感激。或者你可以解释说这一切都是个坏主意,不应该实现。
【问题讨论】:
-
我经常遇到这种情况。最终,我发现手动分配属性比使用反射或 Automapper 之类的映射实用程序更容易。
-
我不太明白,但我怀疑使用反射在已知类型上动态执行此操作可能很糟糕。明确并在编译时得到你的错误。
标签: c# linq reflection