最近我问了一个关于通过外键获取模型属性的更一般的问题。 现在我移动了一点,但仍然不知道如何动态转换对象。
我得到的是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
})
我不想在顶部列举我需要的所有字段。
我能够创建一个方法来识别哪些字段具有简单值,哪些字段具有通过外键引用的对象。然后该方法将返回属性列表。
现在我需要一些方法在foreach
内写一些类似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中实现这一点。
因此,如果你能为这项任务提出一些解决方案,我将非常感激。或者也许你可以解释这一切都是一个坏主意,不应该实现。
答案 0 :(得分:2)
您将无法使用动态属性创建匿名类型,因为在编译期间会创建anon类型,并且在执行期间会创建属性。
但是,如果您不打算对它们进行编码,为什么还需要强类型属性,因为在有人执行查询之前您不会知道它们?
Expando对象可能对您有用吗?
http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx