C#反射使用方法过程及步骤是怎样的
发表于:2024-11-18 作者:千家信息网编辑
千家信息网最后更新 2024年11月18日,C#反射使用方法过程及步骤是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。示例:1. 根据窗口类的名称,产生一个新
千家信息网最后更新 2024年11月18日C#反射使用方法过程及步骤是怎样的示例:
C#反射使用方法过程及步骤是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
示例:
1. 根据窗口类的名称,产生一个新的窗口,相当于new 窗口类
//1. 定义窗口类名称:(窗口类的字符串名字,需要全路径名,否则获取不到TYPE) string customClassName = @"IBAutoDeal.IBDealForms." + hasPanel.Text; //2. 获取字符串customClassName(某个窗口类的字符串名字)指定类的TypeType customClassType = Type.GetType(customClassName); //3. 生成指定Type的实例,相当于new 类 object customClassObj = Activator.CreateInstance(customClassType); // 4. 对新生成的类进行操作, 本例把new 出的窗口赋值给一个窗口变量 panelForm = customClassObj as Form; // 由此达到使用类的字符串名生成一个该类的实例供后续程序的使用
2. 根据类的字符串名字,给该类的字段或属性赋值
//反射功能使用及步骤:以下示例为给字符串类名生成一个实例,并给该类的属性或字段赋值 // 1. 定义类名称:(类的字符串名字,需要全路径名,否则获取不到TYPE)string customVaribleName = @"IBAutoDeal.IBDealClass.CommVar"; // 2. 获取字符串 customVaribleName指定类的TypeType customVaribleType = Type.GetType(customVaribleName); // 3. 生成指定Type的实例,相当于new 类 object customAaribleObj = Activator.CreateInstance(customVaribleType); // 4. 获取该类字段,本例是给一个公共的窗体变量赋值,而该变量在此是字段// 如果是给该类的属性赋值,就需要使用 PropertyInfo pi = customVaribleType.GetField("v" + hasPanel.Text)// 在该类中,某个域是属性还是字段呢?我个人的判断是,若该域提供了GET,SET方法,就为属性,否则为字段,也不知道正确否?FieldInfo pi = customVaribleType.GetField("v" + hasPanel.Text); // 5. 给该字段赋值,该字段是个窗口类变量,customClassObj就是示例1中根据字符串产生的窗口类pi.SetValue(customAaribleObj, customClassObj); // 通过以上5个步骤,完成了根据字符串的名字,给相应类的字段赋值
3. 根据类的字符串名字,读取字段值,并使用该字段值(示例中,该字段值是窗体,该示例是销毁该窗体)
// 1. 定义类名称:(类的字符串名字,需要全路径名,否则获取不到TYPE)string customVaribleName = @"IBAutoDeal.IBDealClass.CommVar"; // 2. 获取字符串 customVaribleName指定类的TypeType customVaribleType = Type.GetType(customVaribleName); // 3. 生成指定Type的实例,相当于new 类 object customAaribleObj = Activator.CreateInstance(customVaribleType); // 4. 获取该类字段,本例是给一个公共的窗体变量赋值,而该变量在此是字段// 如果是给该类的属性赋值,就需要使用 PropertyInfo pi = customVaribleType.GetField("v" + hasPanel.Text)// 在该类中,某个域是属性还是字段呢?我个人的判断是,若该域提供了GET,SET方法,就为属性,否则为字段,也不知道正确否?FieldInfo pi = customVaribleType.GetField("v" + e.Panel.Name); // 5. 读取该字段的值(本示例该字段值为窗体,读取窗体变量,把销毁该窗体) (pi.GetValue(customAaribleObj) as Form).Dispose(); // 6. 再为该字段赋空值pi.SetValue(customAaribleObj, null);
4. 示例3原来是通过switch来判断需要关闭那个窗口,这样就会有很多的case语句,通过反射,就用示例3的6行代码取代了,下面贴出原程序的代码,目的是让大家了解反射的作用:
// 被示例3取代的原代码段(根据e.Panel.Name的值对相应窗口关闭,并给公用变量赋值)switch (e.Panel.Name) { case "FrmAccountStatistics": CommVar.vFrmAccountStatistics.Dispose(); CommVar.vFrmAccountStatistics = null; break; case "frmPositionManager": CommVar.vfrmPositionManager.Dispose(); CommVar.vfrmPositionManager = null; break; case "frmTrader": CommVar.vfrmTrader.Dispose(); CommVar.vfrmTrader = null; break; case "frmLog": CommVar.vfrmLog.Dispose(); CommVar.vfrmLog = null; break; case "frmDataTransPlant": CommVar.vfrmDataTransPlate.Dispose(); CommVar.vfrmDataTransPlate = null; break; case "frmAccountTJ": CommVar.vfrmAccountTJ.Dispose(); CommVar.vfrmAccountTJ = null; break; case "frmGridViewConfig": CommVar.vfrmGridViewConfig.Dispose(); CommVar.vfrmGridViewConfig = null; break; case "frmTaticlistExcel": CommVar.vfrmTaticlistExcel.Dispose(); CommVar.vfrmTaticlistExcel = null; break; case "frmQuoteLst": CommVar.vfrmQuoteLst.Dispose(); CommVar.vfrmQuoteLst = null; break; case "frmProduct": CommVar.vfrmProduct.Dispose(); CommVar.vfrmProduct = null; break; default: break; }
5. 针对 T 的泛类型定义的类,给属性赋值示例代码如下:
public static T ReadClass(string pClassName) where T:class { //1. 定义类名称:(因为有传入的T类,所以不需要类的名称了) //2.获取类T的TYPE,注意,前面例子中是通过字符串取类型,使用的是Type.GetType() Type classType = typeof(T); //3. 生成指定 T 的实例,前面例子中,我们使用的是Activator.CreateInstance(classType) T ClassObj = Activator.CreateInstance (); //4. 定义类的属性变量,因程序要多次读取不同的属性,在此定义一个局部变量 PropertyInfo classPropertyInfo = null; string tableName = "TradeParameters"; //DataTable必须转成DataView才能使用RowFilter DataTable vDt = DataTableHelper.ReadTable(tableName); DataView vDv = vDt.DefaultView; vDv.RowFilter = $"ClassName = '{pClassName}'"; if (vDv.Count > 0) { string pName, pVaule; foreach(DataRow dr in vDv) { pName = dr["AttributeName"].ToString(); pVaule = dr["AttributeValue"].ToString(); //5. 获取指定名称属性 classPropertyInfo = classType.GetProperty(pName); if (classPropertyInfo != null) { //6. 给指定属性赋值 classPropertyInfo.SetValue(ClassObj, pVaule); } } } return ClassObj;}
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。
字段
字符
字符串
属性
变量
示例
名字
窗体
实例
生成
类名
反射
代码
方法
步骤
名称
程序
路径
路径名
个人
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
懂车帝软件开发
eve手游服务器是互通的吗
每次都打开服务器管理器
学软件开发的应聘岗位职称
云服务器支持go语言
浪潮服务器自动关机
网络安全潜伏股票
国产实时数据库系统哪家好
飞熊软件开发
英雄联盟德玛西亚区服务器在哪
沈阳证券软件开发公司
软件开发介绍怎么写
网络安全防范教育文章
虚拟服务器打的电话可以查吗
国家信息中心网络安全期刊
九宫格排版软件开发
企业到底需不需要缓存服务器
access的数据库属于
宣城直播平台软件开发公司
矿场里的服务器是什么意思
数据库装了之后在哪里
联想服务器查保修
高效事务型数据库有哪些
潍坊软件开发企业
数据库信息返回不到页面上
戴尔R730服务器远程管理
亚运会视频软件开发
如何应对网络安全问题体会
嵌入式软件开发 教程
矿场里的服务器是什么意思