2014-02-27 34 views
2

最近我问了一个关于通过外键获取模型属性的更一般的问题。 现在我进一步移动了一点,但仍然不知道如何变换对象。将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中实现这一点。

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

+0

很多时候我遇到过这个问题。最终,我发现手动分配属性更容易,而不是回到使用Reflection或Automapper等映射实用程序。 – Oliver

+0

我不太明白,但是,我怀疑使用反射动态地在已知类型上执行此操作可能是不好的。明确并在编译时得到你的错误。 – Jodrell

回答

2

你不能创建一个具有动态属性的匿名类型,因为在编译期间会创建匿名类型,并且在执行期间创建属性。
但是,为什么你需要强类型属性,如果你不打算对他们进行编码,因为你不知道他们,直到有人执行查询?

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

+0

究竟是什么对象的创建。只要确保将其声明为动态而不是使用var,例如var! –

+0

老实说,它是过分复杂的用例,据我可以告诉 – Oliver

+0

@AdamSears由于你需要访问字段不知道在编译时你实际上*不应该*使用'动态',而你需要使用它的内置方法,或者把它当作一个'IDictionary '来处理。 – Servy

相关问题