2011-10-13 10 views
5

dato il codice qui sottoCome impostare il dizionario di ExpandoObject come maiuscole e minuscole?

dynamic e = new ExpandoObject(); 
var d = e as IDictionary<string, object>; 
for (int i = 0; i < rdr.FieldCount; i++) 
    d.Add(rdr.GetName(i), DBNull.Value.Equals(rdr[i]) ? null : rdr[i]); 

C'è un modo per rendere più case insensitive così dato il nome del campo NOME_DIPENDENTE

e.Employee_name funziona altrettanto bene come e.employee_name

ci doesn' t sembra essere un modo ovvio, forse un hack?

risposta

4

È possibile eseguire il checkout dell'implementazione Massive's di MassiveExpando che è un oggetto dinamico senza distinzione tra maiuscole e minuscole.

+0

Interessante, non era a conoscenza di questo fork di massiccia, questo non è stato aggiornato da febbraio quindi guarderà nelle differenze, grazie! – Kumar

1

Più come curiosità che come soluzione:

dynamic e = new ExpandoObject(); 
var value = 1; 
var key = "Key"; 

var resul1 = RuntimeOps.ExpandoTrySetValue(
    e, 
    null, 
    -1, 
    value, 
    key, 
    true); // The last parameter is ignoreCase 

object value2; 
var result2 = RuntimeOps.ExpandoTryGetValue(
    e, 
    null, 
    -1, 
    key.ToLowerInvariant(), 
    true, 
    out value2); // The last parameter is ignoreCase 

RuntimeOps.ExpandoTryGetValue/ExpandoTrySetValue uso metodi interni di ExpandoObject che può controllare la sensibilità caso. I parametri null, -1, vengono prelevati dai valori utilizzati internamente da ExpandoObject (RuntimeOps chiamate direttamente i metodi interni di ExpandoObject)

Ricordare che questi siano This API supports the .NET Framework infrastructure and is not intended to be used directly from your code.

+0

obsoleto non viene compilato in .net 4 http://msdn.microsoft.com/en-us/library/dd782193.aspx – Kumar

+0

@Kumar Devo dire la verità ... Sì, avevo testato il codice su Visual Studio 2010 e funzionava. Solo per essere sicuro stamattina l'ho testato di nuovo e ha funzionato :-) È interessante notare che "ExpandoTryGetValue" e "ExpandoTrySetValue" non sono contrassegnati come obsoleti sul mio computer, quindi non ho ricevuto alcun avviso. – xanatos

+0

hmm, interessante, non sono sicuro di cosa potrebbe essere diverso qui! Non ho potuto compilare, quindi sono andato alla ricerca di risposte e ho trovato la pagina msdn! ho vs2010 ultimate sp1 su xp sp3! non ci sono né beta né nulla su questo pc e non hanno familiarità con uno .net 4 sp1 o anteprima, nessun pensiero? – Kumar

0

IDictionaryExtensionMethods classe statiche pubbliche
{
    static void AddCaseInsensitive (questo dizionario IDictionary, chiave stringa, valore oggetto)
    {
        dictionary.Add (key.ToUpper(), valore);
   }

    oggetto statico pubblico Get (questo dizionario IDictionary, chiave string)
    {
          dizionario ritorno [key.ToUpper()];
   }}

0

Un'altra soluzione è quella di creare una classe ExpandoObject -come derivando dalla System.Dynamic.DynamicObject e prioritario TryGetValue e TrySetValue.

+1

Vedere [la mia risposta] (http://stackoverflow.com/a/19354229/87453) per un esempio –

7

Sto usando questa classe “ Flexpando ” (per expando flessibile) che non fa distinzione tra maiuscole e minuscole.

È simile alla risposta Darin's MassiveExpando in quanto fornisce supporto per il dizionario, ma esponendo questo come campo si risparmia dover implementare circa 15 membri per IDictionary.

public class Flexpando : DynamicObject { 
    public Dictionary<string, object> Dictionary 
     = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); 

    public override bool TrySetMember(SetMemberBinder binder, object value) { 
     Dictionary[binder.Name] = value; 
     return true; 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) { 
     return Dictionary.TryGetValue(binder.Name, out result); 
    } 
} 
+2

Mi piace la semplicità ma sento che ci dovrebbe essere un po 'più di controllo sugli interni . Forse due costruttori, uno vuoto che si trova di default in quello che hai qui e uno che prende un oggetto IDictionary, il costruttore imposta il campo Dizionario, che cambierei in una proprietà pubblica con un setter privato. –

Problemi correlati