2012-04-17 23 views
3

我使用LINQ到實體返回對象訪問,而鑄造的一類

  var st = personsList.Select(p => new 
      { 
       ID = p.Id, 
       Key = p.Key, 
       Name = p.Name, 
       Address = p.Address, 
       City = p.City, 
       PhoneNumber = p.PhoneNumber 
      }) 
      return st.ToList(); 

名單後,我得到另一大類列表我如何可以訪問每個屬性的對象的屬性?

foreach(object s in St) 
{ 
    string name = s.Name; 
} 

我沒有預定義的類的對象轉換爲它。

這樣做可以不需要創建一個類並將該對象轉換爲該類的類型?

謝謝

+1

http://msmvps.com/blogs/jon_skeet/archive/2009/01/09 /horrible-grotty-hack-returning-an-anonymous-type-in​​stance.aspx – 2012-04-17 09:12:52

+0

@TimSchmelter:TL; DR:僅僅因爲你可以不意味着你應該。 :) – 2012-04-17 09:16:06

+1

@GeorgeDuckett:是的,我認爲jon的標題不言自明:_「可怕的糟糕的破解:返回一個匿名類型的實例」_ – 2012-04-17 09:20:06

回答

3

您可以使用follwing

foreach(object s in St) 
{ 
    Type type = s.GetType(); 
    PropertyInfo property = type.GetProperty("Name"); 
    if(property !=null) 
    { 
     string name= (string)property.GetValue(s, null); 
    } 
} 

您必須將命名空間的System.Reflection添加到類

7

您使用的是C#4嗎?你可以嘗試使用dynamic

foreach(dynamic s in St) 
{ 
    string name = s.Name; 
} 

的風險,當然,如果您嘗試訪問該對象沒有你只有會在運行時發現的屬性。

另外,在這種情況下,創建一個具有所有這些屬性的類是否更有意義?你在幾個地方顯然需要它們,你會得到類型安全和編譯時錯誤的好處。

0

C#3.0具有允許隱式轉換的var類型。

+0

它仍然是強類型的(var foo = new Foo() Foo'),你不能用它來返回一個值。它也是隱式輸入,而不是轉換。 – 2012-04-17 09:20:03

0

編譯器正在爲您創建一個可以在方法範圍內使用的匿名類型。如果您需要傳遞LINQ查詢的結果,最好創建一個域對象來表示像PersonSummary這樣的信息並將查詢結果分配給該對象。 C#是強有力的類型利用。