using System; using System.Collections.Concurrent; using MediaBrowser.Model.Reflection; using System.Linq; namespace Emby.Server.Implementations.Data { /// /// Class TypeMapper /// public class TypeMapper { private readonly IAssemblyInfo _assemblyInfo; /// /// This holds all the types in the running assemblies so that we can de-serialize properly when we don't have strong types /// private readonly ConcurrentDictionary _typeMap = new ConcurrentDictionary(); public TypeMapper(IAssemblyInfo assemblyInfo) { _assemblyInfo = assemblyInfo; } /// /// Gets the type. /// /// Name of the type. /// Type. /// public Type GetType(string typeName) { if (string.IsNullOrEmpty(typeName)) { throw new ArgumentNullException("typeName"); } return _typeMap.GetOrAdd(typeName, LookupType); } /// /// Lookups the type. /// /// Name of the type. /// Type. private Type LookupType(string typeName) { return _assemblyInfo .GetCurrentAssemblies() .Select(a => a.GetType(typeName)) .FirstOrDefault(t => t != null); } } }