C#反射使用方法过程及步骤

 更新时间:2021年09月26日 17:39:59   作者:红目香薰  
这篇文章主要为大家详细介绍了C#反射使用方法过程及步骤,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

C#反射使用方法过程及步骤,供大家参考,具体内容如下

1. 定义要访问类的全名

2. 获取该类的类型

3. 实例化该类

4. 获取该类的字段、属性,方法

5. 设置该字段或属性内容,或调用其方法

从而达到使用字符串访问相应类的目的。

示例:

1. 根据窗口类的名称,产生一个新的窗口,相当于new 窗口类

//1. 定义窗口类名称:(窗口类的字符串名字,需要全路径名,否则获取不到TYPE)    
string customClassName = @"IBAutoDeal.IBDealForms." + hasPanel.Text;
 
//2. 获取字符串customClassName(某个窗口类的字符串名字)指定类的Type
Type 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指定类的Type
Type 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指定类的Type
Type 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<T>(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<T>();
            
            //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;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • c#栈变化规则图解示例(栈的生长与消亡)

    c#栈变化规则图解示例(栈的生长与消亡)

    多数情况下我们不需要关心栈的变化,下文会给出一个具体的示例。另外,理解栈的变化对于理解作用域也有一定的好处,因为C#的局部变量作用域是基于栈的。
    2013-11-11
  • C# 日历类功能的实例

    C# 日历类功能的实例

    本文通过实例代码给大家介绍了C#日历类的相关知识,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-06-06
  • 深入理解C#中foreach遍历的使用方法

    深入理解C#中foreach遍历的使用方法

    在c#中通过foreach遍历一个列表是经常拿用的方法,使用起来也方便,下面这篇文章先给大家介绍了关于C#中foreach遍历的使用方法,后面介绍了c#使用foreach注意的一些是,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-08-08
  • 如何在C#中使用注册表

    如何在C#中使用注册表

    这篇文章主要介绍了如何在C# 使用注册表,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12
  • C# DataGridView中实现勾选存储数据和右键删除数据(示例代码)

    C# DataGridView中实现勾选存储数据和右键删除数据(示例代码)

    这篇文章主要介绍了C# DataGridView中实现勾选存储数据和右键删除数据的示例代码,通过示例代码给大家展示运行效果图,需要的朋友可以参考下
    2021-07-07
  • C#计算输入汉字GBK编码后十六进制数输出的方法

    C#计算输入汉字GBK编码后十六进制数输出的方法

    这篇文章主要介绍了C#计算输入汉字GBK编码后十六进制数输出的方法,涉及C#编码操作相关技巧,需要的朋友可以参考下
    2015-04-04
  • C#获取Excel文件所有文本数据内容的示例代码

    C#获取Excel文件所有文本数据内容的示例代码

    获取上传的 EXCEL 文件的所有文本信息并存储到数据库里,可以进一步实现对文件内容资料关键字查询的全文检索,有助于我们定位相关文档,本文详细介绍了C#获取Excel文件所有文本数据内容实现步骤和代码,需要的朋友可以参考下
    2024-07-07
  • C#设计模式之职责链模式示例详解

    C#设计模式之职责链模式示例详解

    这篇文章主要给大家介绍了关于C#设计模式之职责链模式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • C# WinForm中Panel实现用鼠标操作滚动条的实例方法

    C# WinForm中Panel实现用鼠标操作滚动条的实例方法

    由于在WinForm中Panel不能直接响应鼠标的滚动事件,只好采用捕获窗体的滚动事件。
    2013-03-03
  • C#实现飞行棋项目

    C#实现飞行棋项目

    这篇文章主要为大家详细介绍了C#实现飞行棋项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02

最新评论