反射常用到操作

 

  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;
        }

    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值