2009-05-21 71 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); 
}