17

我在将匿名对象作为方法中的参数传递时遇到问题。我想像在 JavaScript 中一样传递对象。例子:

function Test(obj) {
    return obj.txt;
}
console.log(Test({ txt: "test"}));

但是在 C# 中,它会抛出许多异常:

class Test
{
    public static string TestMethod(IEnumerable<dynamic> obj)
    {
        return obj.txt;
    }
}
Console.WriteLine(Test.TestMethod(new { txt = "test" }));

例外:

  1. 参数 1:无法从 'AnonymousType#1' 转换为 'System.Collections.Generic.IEnumerable'
  2. 'ConsoleApplication1.Test.TestMethod(System.Collections.Generic.IEnumerable)' 的最佳重载方法匹配有一些无效参数
  3. “System.Collections.Generic.IEnumerable”不包含“txt”的定义,并且找不到接受“System.Collections.Generic.IEnumerable”类型的第一个参数的扩展方法“txt”(您是否缺少 using 指令还是汇编参考?)
4

3 回答 3

29

看起来你想要:

class Test
{
    public static string TestMethod(dynamic obj)
    {
        return obj.txt;
    }
}

您使用它就好像它是一个单一的值,而不是一个序列。你真的想要一个序列吗?

于 2012-05-30T18:28:14.557 回答
12

这个应该做...

class Program
{
    static void Main(string[] args)
    {
        var test = new { Text = "test", Slab = "slab"};
        Console.WriteLine(test.Text); //outputs test
        Console.WriteLine(TestMethod(test));  //outputs test
    }

    static string TestMethod(dynamic obj)
    {
        return obj.Text;
    }
}
于 2012-05-30T18:41:49.400 回答
4

这很好用:)

public class Program
{
    private static void Main(string[] args)
    {
        Console.WriteLine(Test.TestMethod(new[] {new {txt = "test"}}));
        Console.ReadLine();
    }
}

public class Test
{
    public static string TestMethod(IEnumerable<dynamic> obj)
    {
        return obj.Select(o => o.txt).FirstOrDefault();
    }
}
于 2012-05-30T18:33:37.540 回答