我第一次尝试使用匿名类型(测试):
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)
{
}
提前致谢!
答案 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);
}
}
}