【问题标题】:Convert IEnumerable<T> to collection of dynamically generated objects将 IEnumerable<T> 转换为动态生成对象的集合
【发布时间】: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


【解决方案1】:

您将无法创建具有动态属性的匿名类型,因为匿名类型是在编译期间创建的,而您的属性是在执行期间创建的。
但是,如果您不针对它们编写代码,为什么需要强类型属性,因为在有人执行查询之前您不会知道它们?

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

【讨论】:

  • 该对象的确切创建目的。只需确保将其声明为动态而不是使用 var!
  • 老实说,据我所知,用例过于复杂
  • @AdamSears 由于您需要访问编译时未知的字段,您实际上不应该使用dynamic,而是需要使用它的内置方法,或将其视为IDictionary&lt;string,object&gt;
  • @Servy:您可以将 ExpandoObject 转换为 IDictionary 即使它被声明为动态并通过它枚举,或者像字典一样使用它。我将它用于排除规则系统,该系统具有从数据库中的各种表中提取的未知数量的数据列。工作得很好;但这可能不是 OP 想要或需要的。 YMMV。
  • @AdamSears 这就是我的意思,但您不会想将其转换为dynamic。他需要将其转换为IDictionarydynamic 暴露的内容不允许他做他想做的事。
猜你喜欢
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
相关资源
最近更新 更多