internal class ReflectionHelper
{
private static Dictionary<string, Type> m_dicReflectionType = new Dictionary<string, Type>();
public static void PreAdd(string name)
{
if (m_dicReflectionType.ContainsKey(name)) return;
Assembly assembly = Assembly.GetAssembly(typeof(ReflectionHelper)); // 获取当前程序集
Type[] types = assembly.GetExportedTypes();
for (int i = 0; i < types.Length; ++i)
{
var t = types[i];
if (t.IsClass && t.FullName == name)
{
m_dicReflectionType[name] = t;
break;
}
}
}
public static List<Type> GetAllClassByInterface(Type typeInterface)
{
List<Type> lstType = new List<Type>();
Assembly assembly = Assembly.GetAssembly(typeof(ReflectionHelper)); // 获取当前程序集
Type[] types = assembly.GetExportedTypes();
for (int i = 0; i < types.Length; ++i)
{
var t = types[i];
if (!t.IsClass)
continue;
Type typeInfo = t.GetInterface(typeInterface.Name);
if (typeInfo != null)
{
lstType.Add(t);
}
}
return lstType;
}
public static List<Type> GetAllSubclassByType(Type typeBase)
{
List<Type> lstType = new List<Type>();
Assembly assembly = Assembly.GetAssembly(typeof(ReflectionHelper)); // 获取当前程序集
Type[] types = assembly.GetExportedTypes();
for (int i = 0; i < types.Length; ++i)
{
var t = types[i];
if (t.IsClass && t.IsSubclassOf(typeBase))
{
lstType.Add(t);
}
}
return lstType;
}
public static Type GetTypeByName(string name)
{
if (m_dicReflectionType.ContainsKey(name))
return m_dicReflectionType[name];
//MyLog.Log("Not Preload Type" + name);
Assembly assembly = Assembly.GetAssembly(typeof(ReflectionHelper)); // 获取当前程序集
Type[] types = assembly.GetTypes();
for (int i = 0; i < types.Length; ++i)
{
var t = types[i];
if (t.IsClass && t.Name == name)
{
m_dicReflectionType[name] = t;
return t;
}
}
CLog.LogError("not find objecttype = " + name);
return null;
}
public static object CreateObjectByName(string name, object[] param = null)
{
Type type = GetTypeByName(name);
if (type == null)
return null;
return Activator.CreateInstance(type, param);
}
public static T CreateClassByName<T>(string name, object[] param = null) where T : class
{
if (string.IsNullOrEmpty(name))
{
CLog.LogError("name is null or empty");
return null;
}
object obj = CreateObjectByName(name, param);
if (obj == null)
return null;
T ret = (obj is T) ? (obj as T) : null;
if (ret == null)
{
CLog.LogError("name = " + name + " is not a class Type");
}
return ret;
}
public static T ConvertValueTo<T>(object value) where T : struct
{
T? result = null;
if (value != null && !(value is DBNull))
{
result = (T?)Convert.ChangeType(value, typeof(T));
}
if (result == null)
{
CLog.LogError("value = " + value + " can't convert to " + typeof(T));
return default(T);
}
return (T)result;
}
}