将IEnumerable <t>转换为动态生成的对象的集合</t>

时间:2014-02-27 14:24:34

标签: c# linq reflection

最近我问了一个关于通过外键获取模型属性的更一般的问题。 现在我移动了一点,但仍然不知道如何动态转换对象。

我得到的是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中实现这一点。

因此,如果你能为这项任务提出一些解决方案,我将非常感激。或者也许你可以解释这一切都是一个坏主意,不应该实现。

1 个答案:

答案 0 :(得分:2)

您将无法使用动态属性创建匿名类型,因为在编译期间会创建anon类型,并且在执行期间会创建属性。
但是,如果您不打算对它们进行编码,为什么还需要强类型属性,因为在有人执行查询之前您不会知道它们?

Expando对象可能对您有用吗?
http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx