1

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

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

提前致谢!

4

5 回答 5

5

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

于 2009-05-21T18:20:52.040 回答
4

a 是匿名类型的字符串属性

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

private void test(string a)
{
}

编辑:匿名类型不派生自对象以外的任何东西,因此您无法创建需要匿名类型参数的方法。

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

警告,我很难想出很好的示例场景,这一切都来自记忆!例如,如果我有一个 Person 对象列表,该列表具有 name 属性和 address 属性,其中包含街道地址并需要绑定到列表框

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 };
于 2009-05-21T18:21:11.727 回答
2

在方法之间传递匿名类型没有干净的方法;你不应该这样做。而是创建一个真实的类型。

如果您真的想这样做,您可以使用辅助方法来笨拙地伪造它,方法是创建另一个该类型的“模板”以便稍后转换;看到这个和许多类似的文章。

编辑: 仔细检查后,您似乎并不了解匿名类型实际上是什么,所以我建议您采用其他答案。

于 2009-05-21T18:20:44.023 回答
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);
}
于 2015-11-12T12:41:40.787 回答
-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);
        }
    }
}
于 2009-05-21T18:24:09.710 回答