2014-02-27 37 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

相關問題