public static ElementoBinario GetSerializador(Type tipo) { ElementoBinario elemento; if (DicTiposBasicos.ContainsKey(tipo.AssemblyQualifiedName)) { elemento = ElementoBinario.ElementoTipoAceptado(Serializar.AssemblyToEnumTipoAceptado(tipo.AssemblyQualifiedName)); } else if (tipo.ImplementInterficie(typeof(IElementoBinarioComplejo))) { elemento = ((IElementoBinarioComplejo)tipo.GetObj()).Serialitzer; if (Equals(elemento, default)) { //significa que el Serializador se tiene que generar elemento = IGetSerialitzerAuto(tipo); } } else if (SerializadoresTiposNoSoportados.ContainsKey(tipo.AssemblyQualifiedName)) { elemento = SerializadoresTiposNoSoportados[tipo.AssemblyQualifiedName]; } else { elemento = IGetSerialitzerAuto(tipo); } return(elemento); }
public static bool EsCompatible(Type tipo) { //TiposMios //tener en cuenta los tipos que añaden en SerializadoresTiposNoSoportados bool compatible = DicTipos.ContainsKey(tipo.AssemblyQualifiedName) || SerializadoresTiposNoSoportados.ContainsKey(tipo.AssemblyQualifiedName); if (!compatible) //TiposBasicos { compatible = DicTiposBasicos.ContainsKey(tipo.AssemblyQualifiedName); } if (!compatible)//Array Tipo // Las listas genericas mirar sus tipos { compatible = (tipo.IsArray || tipo.ImplementInterficie(typeof(IList <>))) && EsCompatible(tipo.GetElementType()); } if (!compatible)//los diccionarios { compatible = tipo.IsGenericType && tipo.ImplementInterficie(typeof(IDictionary <,>)) && EsCompatible(tipo.GetGenericArguments().First()) && EsCompatible(tipo.GetGenericArguments().Last()); } if (!compatible)//KeyValuePair { compatible = tipo.IsGenericType && tipo.GetGenericTypeDefinition().AssemblyQualifiedName.Equals(typeof(KeyValuePair <,>).AssemblyQualifiedName) && !tipo.GetGenericArguments().Select((t) => EsCompatible(t)).Any((esCompatible) => !esCompatible); } if (!compatible) //TwoKeys { compatible = tipo.IsGenericType && tipo.GetGenericTypeDefinition().AssemblyQualifiedName.Equals(typeof(TwoKeys <,>).AssemblyQualifiedName) && !tipo.GetGenericArguments().Select((t) => EsCompatible(t)).Any((esCompatible) => !esCompatible); } if (!compatible) { compatible = GuardarSerializadoresAutosHechos && SerializadoresElementosAutosHechos.ContainsKey(tipo.AssemblyQualifiedName); if (!compatible) { //si es un tipo con propiedades compatibles es compatible try { //mirar si hay recursividad infinita GetElementoComplejoAuto(tipo); compatible = true; } catch { } } } return(compatible); }