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

简介: C#反射使用方法过程及步骤5. 针对 T 的泛类型定义的类,给属性赋值示例代码如下:

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);

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;
        }
相关文章
|
28天前
|
设计模式 程序员 C#
C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤
WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug
|
3月前
|
Android开发 iOS开发 C#
Xamarin.Forms:从零开始的快速入门指南——打造你的首个跨平台移动应用,轻松学会用C#和XAML构建iOS与Android通用界面的每一个步骤
【8月更文挑战第31天】Xamarin.Forms 是一个强大的框架,让开发者通过单一共享代码库构建跨平台移动应用,支持 iOS、Android 和 Windows。使用 C# 和 XAML,它简化了多平台开发流程并保持一致的用户体验。本指南通过创建一个简单的 “HelloXamarin” 应用演示了 Xamarin.Forms 的基本功能和工作原理。
79 0
|
4月前
|
数据采集 Web App开发 JavaScript
快速参考:用C# Selenium实现浏览器窗口缩放的步骤
在C#结合Selenium的网络爬虫应用中,掌握浏览器窗口缩放、代理IP、cookie与user-agent设置至关重要。本文详述了如何配置代理(如亿牛云加强版),自定义用户代理,启动ChromeDriver,并访问目标网站如抖音。通过执行JavaScript代码实现页面缩放至75%,并添加cookie增强匿名性。此策略有效规避反爬机制,提升数据抓取的准确度与范围。代码示例展示了整个流程,确保爬虫操作的灵活性与高效性。
114 3
|
5月前
|
机器学习/深度学习 开发框架 .NET
技术经验解读:【c#】反射真的很可怕吗?
技术经验解读:【c#】反射真的很可怕吗?
|
6月前
|
API C# 数据库
C#反射详解
C#反射详解
61 0
|
6月前
|
设计模式 C#
C#反射机制实现开闭原则的简单工厂模式
C#反射机制实现开闭原则的简单工厂模式
54 0
|
6月前
|
存储 C# 开发者
C# | 通过反射将对象属性展示在TreeView中
在编程过程中,我们经常需要处理复杂的对象和数据结构。将这些数据结构展示在UI界面上是很有用的,可以帮助开发者更好地理解和分析数据。 而TreeView作为一种常见的控件,可以以树状结构的方式展示数据,非常适合用于展示层次化的对象。 本文将介绍如何使用TreeView控件展示一个对象,并且可以动态处理对象中的属性和子对象。通过本文的学习,您将学会如何更好地理解和展示数据,提高编程效率。
74 0
C# | 通过反射将对象属性展示在TreeView中
|
存储 Java API
C#反射(Reflection)详解
反射是.NET中的重要机制,通过反射可以得到*.exe或*.dll等程序集内部的接口、类、方法、字段、属性、特性等信息,还可以动态创建出类型实例并执行其中的方法。反射指程序可以访问、检测和修改它本身状态或行为的一种能力。通俗一点:我们在获取其他实体类的字段名或实列,只能获取公有的,而有了反射之后可以获取私有的,可以获取他的基类等等,可以说把家底查得清清楚楚。
235 1
|
11月前
|
安全 C# 图形学
C#的反射机制
C#的反射机制
|
开发框架 缓存 安全
C#OOP之十三 组件、程序集与反射
C#OOP之十三 组件、程序集与反射
70 0