2012-05-30 13 views
12

メソッドの引数として匿名オブジェクトを渡す際に問題があります。私はJavaScriptのようにオブジェクトを渡したい。例:C#で引数として匿名オブジェクトを渡す

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: 「にSystem.Collectionsに 'AnonymousTypeの#1' から変換することはできません.Generic.IEnumerable '
  2. ' ConsoleApplication1.Test.TestMethod(System.Collect)に最適なオーバーロードされたメソッドが一致します。 ions.Generic.IEnumerable「) は、いくつかの無効な引数
  3. 『を有しているSystem.Collections.Generic.IEnumerableはTXT『と拡張子なしのメソッド 『TXT』タイプの最初の 引数を受け入れる」システム』のため の定義が含まれていません』 .Collections.Generic.IEnumerable」 は(あなたがusingディレクティブまたはアセンブリ参照 不足している?)見つけることができる
+2

なぜあなたはIEnumerableをを望んでいる方法に匿名のオブジェクトを渡していますか?それはちょうど '動的'を受け入れるようにしてください – GregRos

+0

@ GregRosありがとう、ちょうど私は強く型付けされた言語で新しく、私の研究は私にこれを示しています... – user1091156

答えて

17

あなたが望むように見えます:

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

あなたのようにそれを使用していますそれがあれば値ではなく、シーケンスではありません。あなたは本当にシーケンスが欲しいですか?

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

ありがとう、完璧な作品。私はちょうど、物事を書くためにいくつのオプションがあるかということにショックを受けています:) – user1091156

+0

最初のアイテムをつかまえようとしているのであれば、最初に列挙型を取るのはなぜですか? – Servy

+0

@サーベイここではちょうどこれをつまずいているオブザーバーですが、これは単なるテストです。それは問題ではありません。 IMOそれは匿名オブジェクトがしばしばセットで渡される方法であるnew [] {new {..}}を使用する構文規則を証明するので、IEnumerableでテストすることは良いことです。実際、これは私が見る必要があったものです。私はそれを 'params'パラメータとして使用しています。 –

8

これはそれを行う必要があります...

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; 
    } 
} 
関連する問題