今天的内容是通过反射获取类的实体,并且进行赋值,调用方法等。

业务场景:不同的部门要录入不同的数据(①页面字段不同②数据库表不同),所以就为这些部门指定了模板(即xml文件),当部门人员要录入时,只需要选择对应的模板,程序通过模板xml中各个结点中配置的信息,来反射实体对象,并加载配置的字段,进行业务逻辑的操作。

下面开始:

首先,要利用反射来实例化一个对象,要拿到的肯定是①这个类所在的项目(即编译后的dll文件)②这个累的命名空间+类名。

就比如下面我配置xml中的这个节点:


{
"specialField": [{"fieldText": ["姓名","全名",],"fieldIndex": 0,"ValueType": "string","DllName": "Test.dll","TableName": "Test.MyModel.UserClass","TableField": "Name","iSQueryFiled": 1},{"fieldText": ["电话号码","手机号码","联系方式"],"fieldIndex": 1,"ValueType": "string","DllName": "Test.dll","TableName": "Test.MyModel.UserClass","TableField": "Phone","iSQueryFiled": 1},{"fieldText": ["性别",],"fieldIndex": 2,"ValueType": "int","DllName": "Test.dll","TableName": "Test.MyModel.UserClass","TableField": "Sex","iSQueryFiled": 1}
}

解释一下节点含义:

"fieldText":用于显示在输入框旁边的提示,提示用户这里该输入什么信息。
      "fieldIndex": 字段顺序,用于给页面上各个输入框排序。
      "ValueType": 输入框的类型,比如文本框,或者单选框什么的。
      "DllName": 被反射实例化的这个类所在的项目编译后的dll文件名。
      "TableName": 被实例化的这个类所在的命名控件+类名。
      "TableField": 表实体在数据库表中对应的字段名称。
      "iSQueryFiled": 是否作为查询条件。因为我们不可能所有的数据都是insert,我们可以用含有这个标识的字段作为条件去数据库中查询是否有符合条件的数据,来决定是做insert还是update,当然,这里也可以用唯一主键值的方式来做,还是那句话,依自己的业务来决定。

当然,根据自己项目的业务,可以适当地封装能满足业务的xml节点。

下面拿这个结点进入代码部分看一下:

 Dictionary<string, List<InputTemp_Model>> m_Dic_Input = new Dictionary<string, List<InputTemp_Model>>();//key:dll+class 用来标识字段要插入哪张表。value:放字段名和值,用来插入数据
foreach (var item in Dic_Input)//Dic_Input
{string sPath = "";string sType="";try{sPath=item.Value[0].DllName.Trim().Replace(" ", "");sType = item.Value[0].TableName.Trim().Replace(" ", "");}catch (Exception e){throw new Exception("模板节点不完整!");}Assembly assembly = Assembly.LoadFile(System.AppDomain.CurrentDomain.BaseDirectory + sPath);//加载类所在的dll文件,System.AppDomain.CurrentDomain.BaseDirectory是获取当前运行文件所在的文件夹(不包含文件名,只到最内层文件夹名)                                               Type type = assembly.GetType(sType);//获取类                                                 object Table = Activator.CreateInstance(type);//创建该类型的实例var props = type.GetProperties().ToList();//拿到类中的所有属性var queryConditionList = (QueryConditionCollection)type.GetProperty("QueryConditionList", BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance).GetValue(Table);//表实体的查询条件列表item.Value.ForEach(f =>{var field = type.GetProperty(f.TableField, BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance);//在类属性列表中找到和当前字段同名的属性,第二个参数的意思是忽略大小写var fieldValue = f.Value;//获取要写入字段的值var fvalue = TypeDescriptor.GetConverter(field.PropertyType).ConvertFrom(fieldValue);//将值进行强制转换,转为类中属性的类型if (fieldValue != null){field.SetValue(Table, fvalue);//给表实体赋值}if (f.iSQueryFiled == 1)//如果作为查询是否存在的字段,就插入查询条件{queryConditionList.Add(fvalue, field.Name); //queryConditionList是我封装在类中的查询条件集合,用于拼装查询数据库表时的where条件}});MethodInfo mf_SelectCount = type.GetMethod("SelectCount");//SelectCount是我封装在实体类中用于查询数据库的方法,返回值是数据行数int dataCount = (Int32)mf_SelectCount.Invoke(Table, null);//调用方法if (dataCount > 0)//如果有数据,就做upt{Update((IEntity2)Table);//我封装的方法,用来修改数据库数据,觉得这里不好封装的小伙伴,可以将这个方法封装在实体表那个类中}else//否则,做insert{foreach (PropertyInfo info in props)//循环表属性,给主键赋值{var att = info.GetCustomAttribute<ColumnAttribute>();if (att != null){if (att.PrimaryKey == true){int newId = (Int32)(type.GetMethod("GetNewId_Int", new Type[] { typeof(string) }).Invoke(Table, new object[] { info.Name }));var field = type.GetProperty(info.Name, BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance);field.SetValue(Table, newId);//给表实体赋值break;}}}Insert((IEntity2)Table);//我封装的方法,用来插入数据库数据,觉得这里不好封装的小伙伴,可以将这个方法封装在实体表那个类中}}

上面就是利用反射来实例化实体,并且完成与数据库交互,注释很详细,认真去看就可以,这里不进行赘述。下面展示一下我字典中那个value的封装。

 public class InputTemp_Model{public string DllName { get; set; }public string TableName { get; set; }public string FieldName { get; set; }public int iSQueryFiled { get; set; }public string Value { get; set; } //业务表中的字段值}

因为只是一个demo,所以只简单放了这些基础字段。

也可以用反射来生成各种控件,这个以后得空了讲。

痛点:比如有一个泛型类People<T>,要反射这个类时,这个T该传入什么或者是用什么方法可以来实例化到这个泛型类,我到现在也没解决,有兴趣的小伙伴可以下方评论区讨论,或者有大神知道的可以评论区讲解一下。

C# 反射 实例化类相关推荐

  1. 利用反射动态实例化类执行方法并传值

    /// <summary>         /// 利用反射动态实例化类执行方法并传值         /// </summary>         /// <param ...

  2. Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?

    文章目录 前言 一.私有方法在本类中直接调用 1.1.在本类中实例化,调用私有方法 1.2.尝试在其他类直接调用私有方法(错误示范) 二.使用反射实例化类强制调用私有方法 2.1.使用类加载器加载被调 ...

  3. java—使用反射对类进行操作(Class对象获取类名,包名,父类,接口,构造方法,普通方法,属性)

    (一)Class对象获取类名,包名,父类,接口 前提条件: 有两个接口IMessage,SystemEdition 一个父类Father 一个子类Son继承父类,实现两个接口IMessage,Syst ...

  4. java 动态获取类实例化_Java:使用反射动态实例化类

    使用反射动态实例化类,可以在运行时根据参数实例化不同的类,比如使用简单的工厂模式. Factory类: public class Factory { public static Component g ...

  5. 【Android 插件化】Hook 插件化框架 ( 反射工具类 | 反射常用操作整理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  6. 反射工具类,如斯优雅

    Foreword 反射的作用我在这就不多说了,每次用到反射都是那么一坨代码丢进去,总是让人觉得很不优雅,如今有了我这个反射工具类,那么大家就可以一句话优雅地来完成反射的工作,该工具类是站在 jOOR ...

  7. python 元类的call_python3 全栈开发 - 内置函数补充, 反射, 元类,__str__,__del__,exec,type,__call__方法...

    python3 全栈开发 - 内置函数补充, 反射, 元类,__str__,__del__,exec,type,__call__方法 一, 内置函数补充 1,isinstance(obj,cls)检查 ...

  8. Java 反射取类中类_Java反射机制(二):通过反射取得类的结构

    在反射运用过程中,如果你想得到一个类的完整结构,那么就要使用到java.lang.reflect包中的几个类: · Constructor  表示类中的构造方法 · Field  表示类中的属性 · ...

  9. java 反射 本类_Java 反射 Class类

    Java 反射 Class类 @author ixenos 摘要:Class类在反射中的地位.构造Class对象的三种方式.Class对象构造对应类型对象的三种方式 Class类在反射中的地位 位于j ...

最新文章

  1. Only the original thread that created a view hierarchy can touch its views
  2. oracle var/tmp,关于/var/tmp/.oracle 目录(ZT)
  3. Matrix Studio LeetCode 刷题指南
  4. ubuntu下安装openfetion
  5. 类与对象的小结 java 1614782140
  6. openssl passwd
  7. arcgis导出地图分辨率多少合适_地图册制作:ArcGIS分幅制图——以深圳地铁线路图为例...
  8. Java面试图片找规律,校招 - 行业测评题、图形推理题、逻辑思维面试题,解题技巧汇总...
  9. 智能红绿灯自动控制系统分析
  10. 我们应该能够识别的表象和本质
  11. 一维离散余弦变换(DCT)及其反变换(IDCT)公式的一种推导
  12. c语言实现数据写入存储地址,c语言中通过指针将数值赋值到制定内存地址
  13. dango models and database ---- verbose name
  14. 如何在达梦数据库安装ODBC
  15. marvell raid linux,联想ThinkStation工作站板载Marvell阵列创建方法
  16. Windows系统环境变量之path环境变量(Python, Java环境变量配置)
  17. CentOS Linux release 7.7-安装搜狗输入法、Pycharm无法输入中文解决
  18. linux centos7安装ftp步骤
  19. 新玺配资:市场强势修复 量能或成隐患
  20. 矩阵的QR分解(jama和emjl对比,UJMP锦上添花)

热门文章

  1. PMP,IPMP,CPMP的区别
  2. 威廉森《宏观经济学》第五版笔记和课后答案
  3. 内部管理类软件基础架构思想(思路图解 + 配套免费视频)
  4. Win10 安装VC++6.0
  5. Nvidia Summer Camp Day34 个人心得
  6. CNNs中,什么是max pooling, 为什么需要max pooling
  7. 2021年黄冈中学高考成绩查询,黄冈高中2021年3月试题及答案
  8. ubuntu16.04安装qq
  9. 针对WEB服务器的攻击途径和防范措施
  10. Mathcad tips_迭代计算