2012-05-30 19 views
12

Tengo un problema al pasar un objeto anónimo como argumento en un método. Quiero pasar el objeto como en JavaScript. Ejemplo:Pasar un objeto anónimo como argumento en C#

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

Pero en C#, que arroja muchas excepciones:

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

Excepciones:

  1. Argumento 1: no se puede convertir de 'AnonymousType # 1' a 'System.Collections .Generico.IEnumerable '
  2. La mejor coincidencia de método sobrecargado para ' ConsoleApplication1.Test.TestMethod (System.Collect ions.Generic.IEnumerable) ' tiene algunos argumentos no válidos
  3. 'System.Collections.Generic.IEnumerable' no contiene una definición de 'txt' y ningún método de extensión '.txt' aceptar un primer argumento de tipo' System .Collections.Generic.IEnumerable' se pudo encontrar (¿falta una directiva using o una referencia de ensamblado ?)
+2

¿Por qué estás pasando un objeto anónimo a un método que quiere IEnumerable? hacer que acepte simplemente 'dinámico' – GregRos

+0

@GregRos gracias, solo soy nuevo en lenguajes fuertemente tipados y mis investigaciones me muestran esto ... – user1091156

Respuesta

17

parece que usted quiere:

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

se está usando como si es un si ngle valor, no una secuencia. ¿De verdad quieres una secuencia?

3

Esto funciona bien :)

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

Gracias, funciona perfecto. Estoy sorprendido de cuántas opciones hay para escribir algo :) – user1091156

+0

Si solo vas a tomar el primer artículo, ¿por qué tomar un enumerable en primer lugar? – Servy

+0

@Servy Sólo un observador aquí se tropieza con esto ahora, pero es solo una prueba; No importa. OMI es bueno probar con IEnumerable porque demuestra la convención de sintaxis de usar new [] {new {..}} que es la forma en que los objetos anónimos se pasan a menudo en conjuntos. De hecho, esto es lo que necesitaba ver; Lo estoy usando como un param param. –

8

Esto debe hacerlo ...

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