2011-01-26 12 views
7

Im cercando di utilizzare DynamicObject in C#, e avevo bisogno di una serie di dinamica:Matrice di dinamica | ExpandoObject | con una sintassi di inizializzazione compressa

var d = new dynamic[]; 

che funziona bene.

MODIFICA: vedere ExpandoObject di seguito.

Ma mi piace anche riempire tale array con alcuni dati con questo compressa inizializzare nuova sintassi:

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

Ma in questo caso tutti gli oggetti ottiene il tipo "oggetto" non dinamica e un ciclo tra gli elementi mi darà un'eccezione:

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

Errore: 'oggetto' non contiene una definizione per 'Nome'. Immagino di aver appena inizializzato gli elementi dell'array nel modo sbagliato. Come aggiungere oggetti dinamici invece?

EDIT: Nuovo contenuto:

mi rendo conto "dinamica" non ha la capacità di aggiungere in modo dinamico proprietà.

È meglio utilizzare ExpandoObject che espone tutti gli elementi in un dizionario interno come proprietà. Ma purtroppo ExpandoObject non sembra sostenere questa bella compressa creare la sintassi, e il compilatore si lamenta:

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

Quindi la risposta potrebbe essere solo: non è possibile.

+4

Sei sicuro non vuoi solo un array di tipo anonimo? – Ani

+1

Si tratta di ASP.NET MVC3? –

+1

Ricorda che un 'dynamic' _is_ un' oggetto', solo che il compilatore C# lo tratta in modo diverso e gestisce tutti gli accessi su 'dynamic' off al DLR – thecoop

risposta

4

vengo un po 'tardi ma qui è quello che ho trovato su di esso:

se non posso inizializzare un ExpandoObject, come su di inizializzazione con un tipo dinamico?

così ho fatto il seguente metodo di estensione

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

Lo so che è ben lungi dall'essere ideale, ma è il meglio che potevo ottenere per ora, funziona così:

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

Grazie Alex, bella idea. – joeriks

+0

Posso utilizzare questo metodo di estensione se la proiezione è memorizzata in una funzione? ad es .: 'someQueryable.Select (ReusableProjection(). ToExpando())', dove 'ReusableProjection' restituisce questo:' Expression > ' – sports

6

Speriamo che non si ha realmente bisogno dinamiche

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ì, così ho pensato, e ho provato anche questo - ma questo mi dà lo stesso errore. Hmm ... – joeriks

+0

@joeriks - ha aggiunto l'intero frammento di codice che stavo lanciando, non ho errori. – Snowbear

+0

@joeriks - se è correlato a ASP.Net MVC, probabilmente dovresti taggare la domanda di conseguenza. Non sono sicuro di come la mia risposta sia correlata al comportamento del rasoio. – Snowbear

1

Il framework open source Impromptu-Interface ha un compressed initialization syntax che funziona con ExpandoObject.

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

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

Cool, darò un'occhiata a Impromptu. – joeriks

Problemi correlati