42 lines
1.2 KiB
C#
42 lines
1.2 KiB
C#
using System;
|
|
using System.Collections.Concurrent;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
|
|
namespace OpenSEMI.Core.Container
|
|
{
|
|
internal static class TypeResolver
|
|
{
|
|
private static ConcurrentDictionary<Type, Type> _typeCache = new ConcurrentDictionary<Type, Type>();
|
|
|
|
public static Type Resolve<T>(string className)
|
|
{
|
|
var type = typeof(T);
|
|
Type implementationType = null;
|
|
|
|
if (!_typeCache.TryGetValue(type, out implementationType))
|
|
{
|
|
implementationType =
|
|
_typeCache[type] = Resolve(className, type);
|
|
}
|
|
|
|
return implementationType;
|
|
}
|
|
|
|
public static Type Resolve(string implementingType, Type serviceType = null)
|
|
{
|
|
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
|
|
var types = assemblies.SelectMany(a => a.GetTypes());
|
|
|
|
Type type = null;
|
|
|
|
if (serviceType != null)
|
|
type = types.FirstOrDefault(t => t.Name == implementingType && serviceType.IsAssignableFrom(t));
|
|
else
|
|
type = types.FirstOrDefault(t => t.Name == implementingType);
|
|
|
|
return type;
|
|
}
|
|
}
|
|
}
|