在C#中将匿名对象作为参数传递

时间:2012-05-30 18:26:40

标签: c# object dynamic ienumerable anonymous

我在将匿名对象作为参数传递给方法时遇到问题。我想像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'的定义,没有扩展方法'txt'接受第一个 类型为'System.Collections.Generic.IEnumerable'的参数 可以找到(你错过了使用指令或程序集 引用?)

3 个答案:

答案 0 :(得分:24)

看起来你想要:

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

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

答案 1 :(得分:11)

应该这样做......

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

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