Domanda

Ho un Dictionary(TKey, TValue) Piace

Dictionary<int, ArrayList> Deduction_Employees = 
    new Dictionary<int, ArrayList>();

e successivamente aggiungo all'elenco di array un tipo anonimo come questo

var day_and_type = new {
    TheDay = myDay,
    EntranceOrExit = isEntranceDelay
};

Deduction_Employees[Employee_ID].Add(day_and_type);

Ora come posso decomprimere quella var e accedere a quelle proprietà??

È stato utile?

Soluzione

In primo luogo, non si unboxing del tipo. tipi anonimi sono tipi di riferimento, non le strutture.

Anche se è possibile tecnicamente creare istanze dello stesso tipo al di fuori del metodo sono state dichiarate in (di cui al punto 7.5.10.6 del C # 3.0 Specifiche del linguaggio, in cui si afferma:

  

all'interno dello stesso programma, due anonimi   inizializzatori oggetto che specificano un   sequenza di proprietà della stessa   nomi ei tipi di compilazione del   stesso ordine produrrà le istanze di   lo stesso tipo anonimo.

) non si ha modo di ottenere il nome del tipo, che è necessario al fine di eseguire il cast da Object indietro al tipo si è creato. Si dovrà ricorrere ad un getto-by-example soluzione che è intrinsecamente sbagliata.

Fusioni-by-example è viziata in quanto dal punto di vista di design, ogni singolo posto che si desidera accedere al tipo di fuori della funzione viene dichiarata (e ancora all'interno dello stesso modulo), si deve dichiarare in modo efficace il tipo tutto nuovo .

Si tratta di una duplicazione degli sforzi che porta alla progettazione e realizzazione sciatta.

Se si utilizza .NET 4.0, allora potrebbero posizionare l'istanza di oggetto in una variabile dinamica. Tuttavia, il principale svantaggio è la mancanza di verifica al momento della compilazione member. Si potrebbe facilmente errori ortografici il nome del membro, e quindi si dispone di un errore di run-time, invece di un errore di compilazione.

In definitiva, se si trova la necessità di utilizzare un tipo anonimo di fuori del metodo è dichiarato in, allora l'unica buona soluzione è quella di creare un tipo di cemento e sostituire il tipo anonimo per il tipo di cemento .

Altri suggerimenti

Esistono diversi modi.

Poiché i commenti sembrano indicare che ti suggerisco di farlo, lasciami chiarire: Dovresti creare un tipo con nome per il tuo oggetto poiché intendi passarlo in giro.

Innanzitutto, puoi utilizzare Reflection, come ha già sottolineato un'altra risposta qui.

Un altro modo che induce .NET a darti il ​​tipo giusto è noto come "cast by example" e funziona in questo modo:È necessario passare l'oggetto tramite una chiamata al metodo generico, che restituirà l'oggetto come il tipo corretto, deducendo il tipo corretto da restituire.

Ad esempio, prova questo:

private static T CastByExample<T>(T example, object value)
{
    return (T)value;
}

e per usarlo:

var x = CastByExample(new { TheDay = ??, EntranceOrExit = ?? }, obj);

per due??spot, devi solo passare qualcosa che corrisponda al tipo di dati per quelle proprietà, i valori non verranno utilizzati.

Ciò sfrutta il fatto che più tipi anonimi contenenti esattamente le stesse proprietà, dello stesso tipo, nello stesso ordine, nello stesso assembly, verranno mappati allo stesso unico tipo.

Tuttavia, a questo punto dovresti invece creare un tipo con nome.

  

Un tipo anonimo ha metodo di portata. Per passare un tipo anonimo, o di una collezione che contiene i tipi anonimi, al di fuori di un metodo di confine, è necessario innanzitutto il cast del tipo di opporsi. Tuttavia, questo sconfigge la forte tipizzazione del tipo anonimo. Se è necessario memorizzare i risultati della query o passarli fuori del metodo di confine, considerare l'utilizzo di un normale nome struct o classe, invece di un tipo anonimo.

Fonte: http://msdn.microsoft.com/en-us /library/bb397696.aspx

No non si può. È possibile accedere solo le proprietà utilizzando riflessione. Il compilatore non ha modo di sapere quale tipo era, e dal momento che è un tipo anonimo, non si può lanciare esso sia.

Se si utilizza .NET 1.x -. 3.x, è necessario utilizzare la riflessione

Se si utilizza .NET 4.0, è possibile utilizzare un tipo dinamico e chiamare le proprietà attese.

In entrambi i casi avete bisogno di unboxing; quello è per i tipi di valore. tipi anonimi sono sempre tipi di riferimento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top