2011-01-26 17 views
7

Im tratando de utilizar DynamicObject en C#, y necesitaba una matriz de dinámica:Matriz de dinámica | ExpandoObject | con una sintaxis de inicialización comprimido

var d = new dynamic[]; 

que funciona muy bien.

EDITAR: Vea ExpandoObject a continuación.

Pero también me gusta llenar esa matriz con algunos datos con este comprimido inicializar nueva sintaxis:

var d = new dynamic[] { 
    new { 
    Name = "Some", 
    Number = 1010 
    }, 
    new { 
    Name = "Other", 
    Number = 2010 
    } 
} 

Pero en ese caso, todos los objetos Obtiene el tipo de "objeto" no dinámica y un bucle a través de los artículos me dará una excepción:

foreach (dynamic item in d) 
{ 
    @item.Name 
    @item.Number 
} 

Error: 'objeto' no contiene una definición para 'Nombre'. Supongo que simplemente inicializo los elementos de la matriz de la manera incorrecta. Cómo agregar objetos dinámicos en su lugar?

EDIT: Nuevo contenido:

realizo "dinámica" no tiene la capacidad de añadir dinámicamente propiedades.

Será mejor que use ExpandoObject, que expone todos los elementos en un diccionario interno como propiedades. Pero, por desgracia ExpandoObject no parece apoyar esta bonita comprimido crear la sintaxis, y el compilador se queja:

var d = new ExpandoObject[]{ 
new ExpandoObject(){ 
    Name="Nnn", 
    Number=1080 
    } 
} 

Así que la respuesta podría ser: no es posible.

+4

¿Seguro de que ¿No solo quieres una matriz de tipo anónimo? – Ani

+1

¿Esto es en ASP.NET MVC3? –

+1

Tenga en cuenta que un '' dinámico' es 'un' objeto', solo que el compilador de C# lo trata de manera diferente y cultiva todos los accesos en 'dynamic' en el DLR – thecoop

Respuesta

4

que llegará un poco tarde, pero aquí es lo que encontré al respecto:

si no puedo inicializar un ExpandoObject, ¿qué hay de inicialización con un tipo dinámico?

así que hice el siguiente método de extensión

public static ExpandoObject CreateExpando(this object item) 
    { 

     var dictionary = new ExpandoObject() as IDictionary<string, object>; 
     foreach (var propertyInfo in item.GetType().GetProperties()) 
     { 
      dictionary.Add(propertyInfo.Name, propertyInfo.GetValue(item, null)); 
     } 
     return (ExpandoObject)dictionary; 
    } 

Sé que es lejos de ser ideal, pero es lo mejor que podía lograr por ahora, funciona así:

var myExpandoObject = new { Name="Alex", Age=30}.CreateExpando(); 
+0

Gracias Alex, buena idea. – joeriks

+0

¿Puedo usar este método de extensión si mi proyección está almacenada en una función? por ejemplo: 'someQueryable.Select (ReusableProjection(). ToExpando())', donde 'ReusableProjection' devuelve esto:' Expression > ' – sports

6

Esperemos que no necesita realmente la dinámica

class Program 
{ 
    static void Main(string[] args) 
    { 
     var d = new[] 
        { 
         new 
          { 
           Name = "Some", 
           Number = 1010 
          }, 
         new 
          { 
           Name = "Other", 
           Number = 2010 
          } 
        }; 
     foreach (var item in d) 
     { 
      string s = @item.Name; 
      int n = @item.Number; 
      Console.WriteLine("{0} {1}", s, n); 
     } 
    } 
} 
+0

Sí, así que pensé, y lo intenté también, pero eso me da el mismo error. Hmm ... – joeriks

+0

@joeriks - agregué el fragmento de código completo que estaba lanzando, no tengo ningún error. – Snowbear

+0

@joeriks: si está relacionado con ASP.Net MVC, entonces probablemente deba etiquetar la pregunta según corresponda. No estoy seguro de cómo mi respuesta se correlaciona con el comportamiento de Razor. – Snowbear

1

El marco de código abierto Impromptu-Interface tiene una compressed initialization syntax que trabaja con ExpandoObject.

dynamic @new = Builder.New<ExpandoObject>(); 

var d = @new.List( 
    @new.Expando(
    Name:"Some", 
    Number: 1010 
), 
    @new.Expando(
    Name:"Other", 
    Number: 2010 
) 
); 
+0

Genial, voy a darle un vistazo a Impromptu. – joeriks

Cuestiones relacionadas