2009-05-21 72 views
1

我第一次嘗試使用匿名類型(測試):匿名類型作爲方法的參數

private void button4_Click(object sender, EventArgs e) 
    { 
     test(new { a = "asd" }); 
    } 

    private void test(string a) 
    { 
    } 

我得到一個錯誤「無法從‘AnonymousType#1’轉換爲‘字符串’」

而且我'想知道如何通過匿名類型,如果參數是一個字符串[]

private void test(string[] a) 
    { 
    } 

在此先感謝!

回答

4

一個是你的匿名類型

private void button4_Click(object sender, EventArgs e) 
{ 
    test((new { a = "asd" }).a); 
} 

private void test(string a) 
{ 
} 

編輯字符串屬性:匿名類型不從除對象以外的任何其他派生,所以你不能創建希望匿名類型參數的方法。

編輯2:當你創建一個匿名類型時,編譯器根據你設置的屬性和它們出現的順序創建一個全新的類型。你不能創建一個匿名類型並用它來代替任何其他類型(除了對象)。我使用過的最常見的場景是當你需要壓扁你的對象圖時進行綁定。

警告,我想出了很好的示例場景,這些都是來自內存! 例如,如果我有這樣的有包含街道地址的名稱屬性和地址屬性並綁定到一個列表框

var people = new List<Person>() 
listbox.TextMember = "Text"; 
listbox.ValueMember = "Value" 
listbox.DataSource = from p in people 
select new { Text = p.Name, Value = p.Address.StreetAddress }; 
2

有沒有乾淨的方法來傳遞方法之間的匿名類型;你不打算這樣做。改爲創建一個真實類型。

如果你確實想要做到這一點,你可以使用一個輔助方法來通過創建另一個類型的「模板」來笨拙地僞裝它,見this和許多類似的文章。

編輯:仔細檢查,你似乎不明白什麼是匿名類型,所以我建議你採取其他答案。

+0

其實,我不想讓你的答案,告訴我它應該看起來像使用匿名類型。 – 2009-05-21 18:28:27

+0

約翰,檢查在mquander的帖子中的鏈接。 – 2009-05-21 18:33:34

5

你的設計有些問題是錯誤的。如果你的測試函數只接受字符串,那麼你永遠不能傳遞一個匿名類型,就像你不能傳遞一個int,object或任何其他非字符串類型一樣。

-1

這是壞需要Person對象的列表,但它的作品...

namespace AnonType 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var foo = new { a = "123", b = "abc" }; 

      Anon(foo); 
      Console.ReadLine(); 
     } 

     public static void Anon(object o) 
     { 
      Console.WriteLine(o); 
     } 
    } 
} 
0

只是偶然發現了這種過時的問題,並認爲有人在這裏應該提到可能使用dynamic開始用C#4.0這是完美的與匿名類型。即代碼可能看起來像這樣:

private void button4_Click(object sender, EventArgs e) 
{ 
    test(new { a = "asd" }); 
} 

private void test(dynamic obj) 
{ 
    Console.WriteLine(obj.a); 
}