2012-05-30 48 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:無法從 'AnonymousType#1' 轉換爲 「System.Collections中.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; 
    } 
} 

你使用它作爲如果它是一個si價值很高,而不是一個序列。你真的想要一個序列嗎?

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

@Servy現在只是一個觀察者在這裏磕磕絆絆,但這只是一個測試;沒關係。國際海事組織(IMO)最好使用IEnumerable進行測試,因爲它證明了使用new [] {new {..}}的語法慣例,這就是匿名對象通常以集合形式傳遞的方式。事實上,這是我需要看到的;我將它用作'參數'參數。 –

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