Si el tipo subyacente de la IDictionary
no implementa IDictionary<string, dynamic>
, no se puede convertir el objeto, y punto. Si lo hace, bastará un lanzamiento simple a través de (IDictionary<string, dynamic>)localVar
.
Si no es así, hay dos cosas que puede hacer:
- copiar el
IDictionary
a su tipo genérico.
- Genere una clase Adapter que acepte
IDictionary
como dependencia e implemente el IDictionary
genérico que desee, asignando llamadas de una a la otra.
Editar: El código de ejemplo que acaba informados copiará el diccionario cada vez que se llama! Editaré de nuevo en un momento con un código sugerido.
Opción 1
su acercamiento código de muestra es sólida como una forma de copiar los datos, pero la copia debe almacenar en caché o vas a copiar un montón de veces. Le sugiero que coloque el código de traducción real en un método diferente y que lo llame desde su propiedad la primera vez que se usa. Por ejemplo:
private IDictionary dataLayerProperties;
private IDictionary<string, dynamic> translatedProperties = null;
protected virtual IDictionary<string, dynamic> Properties
{
if(translatedProperties == null)
{
translatedProperties = TranslateDictionary(dataLayerProperties);
}
return translatedProperties;
}
public IDictionary<string, dynamic> TranslateDictionary(IDictionary values)
{
return values.Keys.Cast<string>().ToDictionary(key=>key, key => values[key] as dynamic);
}
Ahora, hay desventajas obvias a este enfoque ... ¿y si dataLayerProperties necesita actualizarse? Tienes que ir a la configuración translatedProperties en nulo de nuevo, etc.
Opción 2
Este es mi método preferido.
public class TranslatedDictionary : IDictionary<string, dynamic>
{
private IDictionary Original = null;
public TranslatedDictionary(IDictionary original)
{
Original = original;
}
public ICollection<string> Keys
{
get
{
return Original.Keys.Cast<string>().ToList();
}
}
public dynamic this[string key]
{
get
{
return Original[key] as dynamic;
}
set
{
Original[key] = value;
}
}
// and so forth, for each method of IDictionary<string, dynamic>
}
//elsewhere, using your original property and field names:
Properties = new TranslatedDictionary(properties);
Ahora, hay desventajas obvias a este enfoque, así, la más evidente es el hecho de que el Keys
(y valor y cualquier otra cosa que devuelve ICollection
en IDictionary
tiene que devolver una nueva matriz para cada llamada. Pero esto todavía permite el enfoque más flexible, ya que asegura que los datos son siempre al día.
Su nuevo código de muestra copiará los datos en IDictionary * cada vez que se llame *. – Randolpho
única manera de estar al día –
Muy cierto. Aún así, puede probar mi nueva opción sugerida 2. Aunque se va a copiar si se llama a 'Keys' o' Values', siempre estará actualizado, mientras se traduce de un tipo a otro. – Randolpho