2011-10-13 21 views
5

dado el código de abajo¿Cómo configurar el diccionario de ExpandoObject sin distinción de mayúsculas y minúsculas?

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]); 

¿Hay alguna forma para que sea sensible a mayúsculas por lo que dado el nombre de campo employee_name

e.Employee_name funciona igual de bien que e.employee_name

existe doesn' Parece ser una forma obvia, tal vez un truco.

Respuesta

4

Puede finalizar la implementación Massive's de un MassiveExpando que es un objeto dinámico insensible a mayúsculas y minúsculas.

+0

Interesante, no era consciente de este tenedor masivo, esto no ha sido actualizado desde febrero, así que se verá en las diferencias, ¡gracias! – Kumar

1

Más como una curiosidad que como una solución:

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 métodos internos de ExpandoObject que puede controlar la sensibilidad a las mayúsculas. Los parámetros null, -1, se toman de los valores utilizados internamente por ExpandoObject (RuntimeOps llamadas directamente los métodos internos de ExpandoObject)

Recuerde que esos métodos son This API supports the .NET Framework infrastructure and is not intended to be used directly from your code.

+0

obsoleto no se compila en .net 4 http://msdn.microsoft.com/en-us/library/dd782193.aspx – Kumar

+0

@Kumar Tengo que decir la verdad ... Sí, probé el código en Visual Studio 2010 y funcionó. Solo para asegurarme de que esta mañana lo probé de nuevo y funcionó :-) Curiosamente, 'ExpandoTryGetValue' y' ExpandoTrySetValue' no están marcados como obsoletos en mi computadora, así que no recibí ninguna advertencia. – xanatos

+0

hmm, interesante, no estoy seguro de qué podría ser diferente aquí! No pude compilar, así que busqué las respuestas y encontré la página msdn. tengo vs2010 ultimate sp1 en xp sp3! no hay beta ni nada en esta pc y tampoco está familiarizado con .net 4 sp1 o vista previa, ¿alguna idea? – Kumar

0

IDictionaryExtensionMethods clase public static
{
    public static void AddCaseInsensitive (este diccionario IDictionary, clave de cadena, valor del objeto)
    {
        dictionary.Add (clave.ToUpper(), valor);
   }

    objeto estático público Get (este diccionario IDictionary, clave de cadena)
    {
          diccionario de retorno [key.ToUpper()];
   }}

0

Otra solución es crear una clase ExpandoObject -como derivando de System.Dynamic.DynamicObject y primordial TryGetValue y TrySetValue.

+1

Ver [mi respuesta] (http://stackoverflow.com/a/19354229/87453) para un ejemplo –

7

He estado usando esta clase “ Flexpando ” (para expando flexible) que no distingue entre mayúsculas y minúsculas.

Es similar a la respuesta Darin's MassiveExpando porque le da soporte al diccionario, pero al exponer esto como un campo ahorra tener que implementar 15 o más miembros para 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

Me gusta la simplicidad, pero creo que debería haber un poco más de control sobre las partes internas . Tal vez dos constructores, uno vacío que tiene por defecto lo que tiene aquí y otro que toma un IDictionary , cualquiera de los constructores establece el campo Diccionario, que yo cambiaría a una propiedad pública con un sistema privado. –

Cuestiones relacionadas