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 に答える