2011-12-02 249 views
3

可能重複:
What’s the return type of an anonymous class如何將匿名類型作爲參數傳遞給方法?

我創建一個匿名類型與像以下查詢:

來電代碼:

var query= from p in _db.ExecuteDataSet(SQL).Tables[0].AsEnumerable() 
         select new { 
             ProductCode = p.Field<string>("PRODUCT_CODE"), 
             ProductName = p.Field<string>("PRODUCT_NAME") 
            }; 
foreach(var product in query) 
{ 
    WriteProduct(product); 
} 

方法類似於:

void WriteProduct(object prod) 
{ 
    // access the product 
} 

我無法獲得WriteProduct方法的正確參數類型。請幫幫我。

+3

匿名類型幾乎是他們所稱的:它們沒有名稱。如果它沒有名稱,則不能引用它。如果你想能夠引用它,請將它設置爲完整的類或結構體。 – zneak

+0

@zneak:匿名類型具有在編譯時已知的類型名稱。你可以像這樣得到它:product.GetType()。FullName。這對OP沒有幫助,但您的評論並不完全正確。 –

+0

@Eric J.我糾正了。 – zneak

回答

10

是的,你可以。

public class Program 
{ 
    private static void Thing(dynamic other) 
    { 
     Console.WriteLine(other.TheThing); 
    } 

    private static void Main() 
    { 
     var things = new { TheThing = "Worked!" }; 
     Thing(things); 
    } 
} 

但作爲一個小的細節,不要!

匿名類型由於某種原因是匿名的,它們不是代碼中的頭等實體,它們更方便。如果某種類型非常重要,請將其定義爲這樣。

2

糾正我,如果我錯了,但我認爲你應該創建一個臨時類來存儲產品。

select new TempProduct { 
    productCode = p.Field<string>("PRODUCT_CODE"), 
    productName = p.Field<string>("PRODUCT_NAME") 
}; 

隨着例如一類這樣

public class TempProduct 
{ 
    public String productCode { get; set; } 
    public String productName { get; set; } 
} 
+0

+1;我會讓名字有首字母大寫,即使這是一個使用有限的類。 'ProductCode'而不是'productCode'。 –

+0

是的,我在開始的時候就是這樣想的,但着色可能會讓某人感到困惑,因爲它的顏色像一個班級。但我在這裏和你在一起! – Niklas

6

有3種方法交談匿名類型:

  • 反射(通過obj.GetType().GetProperties()/prop.GetValue(obj, null)獲得的屬性等)
  • dynamic(即obj.ProductCodeobj.ProductType,對於dynamic obj ) - 優化的和的漂亮版本上述
  • 鑄造按示例:不使用

WriteProduct必須使用這些中的一個;或者:使用除匿名類型以外的其他內容;一個Tuple<...>,也許(雖然這往往會使它很難知道什麼數據) - 或適當定義的自定義接口,類或結構。

+1

「以身作則」? (我不會使用它,我保證!) –

+0

@GeorgeDuckett有一些令人討厭的方式可以濫用(在模塊內保證)事實,即具有相同名稱和相同類型的兩個匿名類型在相同順序中將是相同類型。例如,您可以在方法內部創建一個雙值對象,並使用它來欺騙泛型類型推斷,將未知值輸入到該類型中。雜亂,真的非常脆弱。 http://pastie.org/2953799 –

+0

啊,聰明的東西。我絕對不會使用它;看起來真的很像一些非常臭的代碼! –

2

這不完全是你要求的,但你的選擇只有兩個屬性,那麼如何將這兩個屬性傳遞給該方法呢?

foreach(var product in query) 
{ 
    WriteProduct(product.ProductCode, product.ProductName); 
} 
// ... 
void WriteProduct(string productCode, string productName) 
{ 
    // ... 
} 
相關問題