C#反射使用方法过程及步骤是怎样的
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,C#反射使用方法过程及步骤是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。示例:1. 根据窗口类的名称,产生一个新
千家信息网最后更新 2025年11月07日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安全错误
数据库的锁怎样保障安全
不能在安全的服务器
web服务器默认文档
公司网站建设软件开发
网络技术等级认证
软件开发环境与工具习题
新乡企业管理软件开发
我的世界服务器在线玩
云裳甄选公司网络技术员
云服务器内存异常监控
苏州常用网络技术
360网络安全先行赔付
南宫软件开发怎样收费
人文地理工作数据库
软件开发太原公司
深圳第三方软件开发怎么样
医院网络安全培训通知模板
山西运城网络技术有限公司
网络安全信息化知识题库
太仓品牌网络技术有哪些
渔业对数据库技术应用
到哪里学习网络安全
mysql数据库监听作用
枣庄安卓软件开发外包公司
世界上最大的网络安全事件
关于网络安全主题班会的方案
值得信赖的数据库漏洞扫描
北斗服务器怎么样
车易网络技术有限公司
科技译文mysql数据库
云原生数据库哪个好