2012-05-30 16 views
12

Mam problem z przekazaniem anonimowego obiektu jako argumentu w metodzie. Chcę przekazać obiekt jak w JavaScript. Przykład:Przekazywanie obiektu anonimowego jako argumentu w języku C#

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

Ale w C#, rzuca wiele wyjątków:

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

wyjątkami:

  1. Argument 1: nie można przekonwertować z 'AnonymousType # 1' do „System.Collections .Generic.Znaczny '
  2. Najlepsza przeciążona metoda pasująca do ' ConsoleApplication1.Test.TestMethod (System.Collect ions.Generic.IEnumerable) „ ma pewne nieprawidłowe argumenty
  3. «System.Collections.Generic.IEnumerable»nie zawiera definicję«txt»i żadna metoda rozszerzenie«txt»akceptującą pierwszy argumentu typu” system .Collections.Generic.IEnumerable” można odnaleźć (czy brakuje using dyrektywa lub odwołania do zestawu ?)
+2

Czemu przechodząc anonimowego obiektu do metody, która chce IEnumerable? sprawiają, że akceptuje po prostu "dynamiczny" – GregRos

+0

@GregRos dziękuję, po prostu jestem nowy w językach ściśle napisanych i moje badania pokazują mi to ... – user1091156

Odpowiedz

17

To wygląda tak, jak chcesz:

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

używasz go jako jeśli to jest si ngle wartość, a nie sekwencji. Czy naprawdę chcesz sekwencji?

3

to dobrze :)

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

Dziękuję, działa idealnie. Jestem po prostu zszokowany tym, ile opcji jest do napisania :) – user1091156

+0

Jeśli masz zamiar pobrać pierwszy przedmiot, dlaczego bierzesz w ogóle przelicznik? – Servy

+0

@Servy Tylko obserwator potyka się o to teraz, ale to tylko test; to nie ma znaczenia. IMO dobrze jest testować za pomocą IEnumerable, ponieważ dowodzi to konwencji składni użycia new [] {new {..}}, w jaki sposób anonimowe obiekty są często przekazywane w zestawach. W rzeczywistości to właśnie musiałem zobaczyć; Używam go jako paramu. –

8

To powinno wystarczyć ...

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; 
    } 
} 
Powiązane problemy