匿名类型作为方法参数

时间:2009-05-21 18:18:20

标签: c# .net anonymous-types

我第一次尝试使用匿名类型(测试):

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

    private void test(string a)
    {
    }

我收到错误“无法将'AnonymousType#1'转换为'string'”

如果参数是字符串[]

,我也想知道如何传递匿名类型
    private void test(string[] a)
    {
    }

提前致谢!

5 个答案:

答案 0 :(得分:5)

关于你的设计的一些问题是错误的。如果您的测试函数只接受字符串,那么您永远不能将匿名类型传递给它,就像您无法传递int,object或任何其他非字符串类型一样。

答案 1 :(得分:4)

a是匿名类型

上的字符串属性
private void button4_Click(object sender, EventArgs e)
{
    test((new { a = "asd" }).a);
}

private void test(string a)
{
}

编辑:匿名类型不是从除object之外的任何内容派生的,因此您无法创建需要匿名类型参数的方法。

编辑2:当您创建匿名类型时,编译器会根据您设置的属性及其显示顺序创建一个全新的类型。您无法创建匿名类型并使用它来代替任何其他类型(除了对象)。我用过的最常见的场景是在需要展平对象图时进行绑定。

警告,我在提出好的示例场景时非常糟糕,而这一切都来自内存! 例如,如果我有一个具有name属性的Person对象列表和一个包含街道地址并需要绑定到列表框的地址属性

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 :(得分:2)

没有干净的方法在方法之间传递匿名类型;你不打算这样做。改为创建一个真实的类型。

如果你真的想要这样做,你可以使用一个帮助方法通过创建该类型的另一个“模板”来笨拙地伪造它以便以后投射;请参阅this和许多类似的文章。

编辑:经过仔细检查,您似乎无法理解匿名类型的实际内容,因此我建议您采取其他答案。

答案 3 :(得分: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);
}

答案 4 :(得分:-1)

这很糟糕,但有效......

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);
        }
    }
}