private bool TryPerformUncachedTypeResolution(string fullName, out Type type, Assembly[] assemblies) { if (null == assemblies) { throw new ArgumentNullException(nameof(assemblies)); } if (string.IsNullOrWhiteSpace(fullName)) { throw new ArgumentException("A type name must not be null nor consist of only whitespace.", nameof(fullName)); } if (TryResolveFromAllAssemblies(fullName, out type, assemblies)) { return(true); } type = Type.GetType(fullName, false) ?? Type.GetType( fullName, ResolveAssembly, ResolveType, false); return(type != null); Assembly ResolveAssembly(AssemblyName assemblyName) { var fullAssemblyName = assemblyName.FullName; if (_assemblyCache.TryGetValue(fullAssemblyName, out var result)) { return(result); } foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { var name = assembly.GetName(); _assemblyCache[name.FullName] = assembly; _assemblyCache[name.Name] = assembly; } return(_assemblyCache.TryGetValue(fullAssemblyName, out result) ? result : null); } Type ResolveType(Assembly asm, string name, bool ignoreCase) { if (TryResolveFromAllAssemblies(name, out var result, assemblies)) { return(result); } return(asm?.GetType(name, false, ignoreCase) ?? Type.GetType(name, false, ignoreCase)); } }
private ValueSerializer GetCustomDeserializer([NotNull] Type type) { //do we already have a deserializer for this type? if (_deserializers.TryGetValue(type, out ValueSerializer serializer)) { return(serializer); } //is there a deserializer factory that can handle this type? foreach (var valueSerializerFactory in Options.ValueSerializerFactories) { if (valueSerializerFactory.CanDeserialize(this, type)) { return(valueSerializerFactory.BuildSerializer(this, type, _deserializers)); } } //none of the above, lets create a POCO object deserializer serializer = new ObjectSerializer(type); //add it to the serializer lookup in case of recursive serialization if (!_deserializers.TryAdd(type, serializer)) { return(_deserializers[type]); } //build the serializer IL code CodeGenerator.BuildSerializer(this, (ObjectSerializer)serializer); return(serializer); }
/// <summary> /// Returns a <see cref="string"/> form of <paramref name="type"/> which can be parsed by <see cref="Type.GetType(string)"/>. /// </summary> /// <param name="type">The type to format.</param> /// <returns> /// A <see cref="string"/> form of <paramref name="type"/> which can be parsed by <see cref="Type.GetType(string)"/>. /// </returns> public static string Format(TypeInfo type) { if (type is null) { throw new ArgumentNullException(nameof(type)); } if (!Cache.TryGetValue(type, out var result)) {
/// <summary> /// Returns a <see cref="string"/> form of <paramref name="type"/> which can be parsed by <see cref="Type.GetType(string)"/>. /// </summary> /// <param name="type">The type to format.</param> /// <returns> /// A <see cref="string"/> form of <paramref name="type"/> which can be parsed by <see cref="Type.GetType(string)"/>. /// </returns> public static string Format(TypeInfo type) { if (type == null) { throw new ArgumentNullException(nameof(type)); } if (!Cache.TryGetValue(type, out var result)) { string FormatType(Type t) { var builder = new StringBuilder(); Format(builder, t.GetTypeInfo(), isElementType: false); return(builder.ToString()); } result = Cache.GetOrAdd(type, FormatType); } return(result); }
private bool TryPerformUncachedTypeResolution(string fullName, out Type type, IEnumerable <Assembly> assemblies) { if (null == assemblies) { throw new ArgumentNullException(nameof(assemblies)); } if (string.IsNullOrWhiteSpace(fullName)) { throw new ArgumentException("A type name must not be null nor consist of only whitespace.", nameof(fullName)); } foreach (var assembly in assemblies) { type = assembly.GetType(fullName, false); if (type != null) { return(true); } } type = Type.GetType(fullName, throwOnError: false); if (type is null) { type = Type.GetType( fullName, ResolveAssembly, ResolveType, false); } return(type != null); Assembly ResolveAssembly(AssemblyName assemblyName) { var fullAssemblyName = assemblyName.FullName; if (_assemblyCache.TryGetValue(fullAssemblyName, out var result)) { return(result); } foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { var name = assembly.GetName(); _assemblyCache[name.FullName] = assembly; _assemblyCache[name.Name] = assembly; } if (_assemblyCache.TryGetValue(fullAssemblyName, out result)) { return(result); } result = Assembly.Load(assemblyName); var resultName = result.GetName(); _assemblyCache[resultName.Name] = result; _assemblyCache[resultName.FullName] = result; return(result); }
public ValueSerializer GetSerializerByType([NotNull] Type type) { //do we already have a serializer for this type? if (_serializers.TryGetValue(type, out ValueSerializer serializer)) { return(serializer); } //is there a serializer factory that can handle this type? foreach (var valueSerializerFactory in Options.ValueSerializerFactories) { if (valueSerializerFactory.CanSerialize(this, type)) { return(valueSerializerFactory.BuildSerializer(this, type, _serializers)); } } //none of the above, lets create a POCO object serializer serializer = new ObjectSerializer(type); if (Options.KnownTypesDict.TryGetValue(type, out ushort index)) { var wrapper = new KnownTypeObjectSerializer((ObjectSerializer)serializer, index); if (!_serializers.TryAdd(type, wrapper)) { return(_serializers[type]); } try { //build the serializer IL code CodeGenerator.BuildSerializer(this, (ObjectSerializer)serializer); } catch (Exception exp) { var invalidSerializer = new UnsupportedTypeSerializer(type, exp.Message); _serializers[type] = invalidSerializer; return(invalidSerializer); } //just ignore if this fails, another thread have already added an identical serializer return(wrapper); } if (!_serializers.TryAdd(type, serializer)) { return(_serializers[type]); } try { //build the serializer IL code CodeGenerator.BuildSerializer(this, (ObjectSerializer)serializer); } catch (Exception exp) { var invalidSerializer = new UnsupportedTypeSerializer(type, exp.Message); _serializers[type] = invalidSerializer; return(invalidSerializer); } //just ignore if this fails, another thread have already added an identical serializer return(serializer); //add it to the serializer lookup in case of recursive serialization }