Подтвердить что ты не робот

Передача анонимного объекта в качестве аргумента в С#

У меня проблема с передачей анонимного объекта в качестве аргумента в методе. Я хочу передать объект, как в JavaScript. Пример:

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

Но в С# это исключает множество исключений:

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

Исключения:

  • Аргумент 1: невозможно преобразовать из "Анонимного типа №1" в 'System.Collections.Generic.IEnumerable'
  • Наилучшее перегруженное соответствие метода для 'ConsoleApplication1.Test.TestMethod(System.Collections.Generic.IEnumerable)' имеет некоторые недопустимые аргументы
  • 'System.Collections.Generic.IEnumerable' не содержит определение для 'txt' и никакого метода расширения 'txt', принимающего первый аргумент типа "System.Collections.Generic.IEnumerable" (если вы не указали директиву или сборку ссылка?)
4b9b3361

Ответ 1

Похоже, вы хотите:

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

Вы используете его, как будто это одно значение, а не последовательность. Вам действительно нужна последовательность?

Ответ 2

Это должно сделать это...

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

Ответ 3

Это отлично работает:)

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