快速开发平台提供一组实体操作方法--使用反射进行模型实体新建复制

快速开发平台为大家提供一组软件类实体操作方法-- C#反射和应用于模型实体新建和复制拷贝

软件快速开发平台反射及模型复制


附上源码:包含软件类反射及实体复制拷贝等。 

        /// <summary>
        /// 创建对象实例
        /// </summary>
        /// <typeparam name="T">软件快速开发平台要创建对象的类型</typeparam>
        /// <param name="assemblyName">类型所在程序集名称</param>
        /// <param name="nameSpace">类型所在命名空间</param>
        /// <param name="className">类型名</param>
        /// <returns></returns>
        public static T CreateInstance<T>(string assemblyName, string nameSpace, string className)
        {
            try
            {
                string fullName = nameSpace + "." + className;//命名空间.类型名
                //此为第一种写法
                object ect = Assembly.Load(assemblyName).CreateInstance(fullName);//加载程序集,创建程序集里面的 命名空间.类型名 实例
                return (T)ect;//类型转换并返回
                //下面是第二种写法
                //string path = fullName + "," + assemblyName;//命名空间.类型名,程序集
                //Type o = Type.GetType(path);//加载类型
                //object obj = Activator.CreateInstance(o, true);//根据类型创建实例
                //return (T)obj;//类型转换并返回
            }
            catch
            {
                //发生异常,返回类型的默认值
                return default(T);
            }
        }
        /// <summary>
      /// 反射复制拷贝模型属性的值
       /// </summary>
      /// <typeparam name="TIn">输入模型类型</typeparam>
       /// <typeparam name="TOut">输出模型类型</typeparam>
       /// <param name="from">输入模型实例</param>
       /// <param name="to">输入模型实例</param>
       /// <param name="includeList">是否包含List属性</param>
       /// <param name="typeName">类型名称</param>
       /// <param name="inCludeId">是否Id一起复制</param>
       /// <param name="hasMC">是否MC标识一起复制拷贝</param>
public static void CopyModel<TIn, TOut>(TIn from, TOut to, bool includeList = false, string typeName = "", bool inCludeId = false, bool hasMC = false)
        {
            if (from == null || to == null)
            {
                return;
            }
            //获取类属性
            PropertyDescriptorCollection fromProperties = TypeDescriptor.GetProperties(from);
            PropertyDescriptorCollection toProperties = TypeDescriptor.GetProperties(to);

            foreach (PropertyDescriptor fromProperty in fromProperties)
            {

                if (string.Compare(fromProperty.Name.ToLower(), typeName.ToLower() + "id") == 0)
                {
                    continue;
                }
                if (!inCludeId && string.Compare(fromProperty.Name.ToLower(), "id") == 0)
                {
                    continue;
                }
                if (string.Compare(fromProperty.Name.ToLower(), "modifyby") == 0 || string.Compare(fromProperty.Name.ToLower(), "modifyat") == 0)
                {
                    continue;
                }
                if (!includeList)
                {
                    if (fromProperty.Name.ToLower().EndsWith("list"))
                    {
                        continue;
                    }
                }
               //通过属性名称获取属性相关描述信息
                PropertyDescriptor toProperty = toProperties.Find(fromProperty.Name, true /* ignoreCase */);
                if (toProperty != null && !toProperty.IsReadOnly)
                {
                    // Can from.Property reference just be assigned directly to to.Property reference?
                    bool isDirectlyAssignable = toProperty.PropertyType.IsAssignableFrom(fromProperty.PropertyType);
                    // Is from.Property just the nullable form of to.Property?
                    bool liftedValueType = (isDirectlyAssignable) ? false : (Nullable.GetUnderlyingType(fromProperty.PropertyType) == toProperty.PropertyType);

                    if (isDirectlyAssignable || liftedValueType)
                    {
                        object fromValue = fromProperty.GetValue(from);
                        if (hasMC && !(string.Compare(fromProperty.Name.ToLower(), "createby") == 0 ||
                        string.Compare(fromProperty.Name.ToLower(), "createat") == 0 || fromProperty.Name.StartsWith("MC")))
                        {

                            PropertyDescriptor tomcProperty = toProperties.Find("MC" + fromProperty.Name, true /* ignoreCase */);
                            if (tomcProperty != null)
                            {

                                if (tomcProperty.GetValue(from) != null && tomcProperty.GetValue(from).ToString() == "1")
                                {
                                    if (isDirectlyAssignable || (fromValue != null && liftedValueType))
                                    {
                                        toProperty.SetValue(to, fromValue);  //类属性值赋值拷贝--反射应用
                                    }
                                }
                            }
                        }
                        else
                        {
                            if (isDirectlyAssignable || (fromValue != null && liftedValueType))
                            {
                                toProperty.SetValue(to, fromValue);
                            }
                        }
                    }
                }
            }
        }

页签:反射 模型复制 实体拷贝

网站&系统开发技术学习交流群:463167176

本站文章除注明转载外,均为本站原创或翻译,欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,共创和谐网络环境。
转载请注明:文章转载自:软件开发框架 » 快速开发平台提供一组实体操作方法--使用反射进行模型实体新建复制
本文标题:快速开发平台提供一组实体操作方法--使用反射进行模型实体新建复制
本文地址:https://www.hocode.com/OrgTec/Back/0037.html

相关文章: 快速开发平台提供一组实体操作方法--验证类||web框架C#委托和事件

电话
电话 18718672256

扫一扫
二维码