C# 反射实例 一
2015-09-20 13:10
621 查看
C# 反射实例
下面例子是从一个项目中拿出来的一块代码,简要介绍下实际项目中如何使用反射
项目有个需求,策划把数据填写到Excel表中,然后保存成 .txt 类型,程序按照相应的表定义类以及字段,然后还要写一个将表中数据读到类中的方法。
表如下
生成.txt
根据表中的字段创建一个类
读取txt,将数据存到哈希表中,具体方法此处略,下面默认已经将数据读取出来了,写一个通用的类,来创建表数据对应的类。
利用反射机制,获取传递进来的类型,将所有字段解析出来,然后赋值
写好了,使用方法如下
运行
看结果有没有把数据赋值给 AgentClass 的实例,上面的方法是通用的,再创建个类试试
运行结果
上面仅仅是测试代码,项目中要根据实际情况加以修改
下面例子是从一个项目中拿出来的一块代码,简要介绍下实际项目中如何使用反射
项目有个需求,策划把数据填写到Excel表中,然后保存成 .txt 类型,程序按照相应的表定义类以及字段,然后还要写一个将表中数据读到类中的方法。
表如下
生成.txt
根据表中的字段创建一个类
AgentClass
public class AgentClass { public int agentID; public int level; public int blood; public byte moveSpeed; public int power; public float attackInterval; public byte characterType; public byte campType; public AgentClass() { } }
读取txt,将数据存到哈希表中,具体方法此处略,下面默认已经将数据读取出来了,写一个通用的类,来创建表数据对应的类。
利用反射机制,获取传递进来的类型,将所有字段解析出来,然后赋值
public static class AnalysisClass { public static T GetTypeClass<T>() where T : new() { T Tclass = new T(); //实例化一个 T 类对象 Type t = Tclass.GetType(); //获取该类类型 //下面紧紧获取该类实例对象的公共字段 FieldInfo[] fieldInfo = t.GetFields(BindingFlags.Public | BindingFlags.Instance); //注意:字段和属性的区别 //如: public int number; number 为字段 //如: N, set、get 为属性 // public int N //{ // get; // set; //} for (int i = 0; i < fieldInfo.Length; i++) { FieldInfo fieldIn = fieldInfo[i]; //将字段名打印出来 Console.WriteLine("field name : " + fieldIn.Name); //获取字段类型 (Byte、Int32、Single、String) Type type = fieldIn.FieldType; //根据字段的类型赋予相应的值,否则将无法赋值和使用 switch (type.ToString()) { case "System.Byte": //由于此处没有写真实的读取的数据,拿 i 来使用了 fieldIn.SetValue(Tclass, byte.Parse(i.ToString())); break; case "System.Int32": fieldIn.SetValue(Tclass, int.Parse(i.ToString())); break; case "System.Single": //浮点型 fieldIn.SetValue(Tclass, float.Parse(i.ToString())); break; case "System.String": fieldIn.SetValue(Tclass, i.ToString()); break; default: break; } } return Tclass; } }
写好了,使用方法如下
class Program { static void Main(string[] args) { AgentClass agentCla = AnalysisClass.GetTypeClass<AgentClass>(); //将字段打印出来 Console.WriteLine("agentID " + agentCla.agentID); Console.WriteLine("level " + agentCla.level); Console.WriteLine("blood " + agentCla.blood); Console.WriteLine("moveSpeed " + agentCla.moveSpeed); Console.WriteLine("power " + agentCla.power); Console.WriteLine("attackInterval " + agentCla.attackInterval); Console.WriteLine("characterType " + agentCla.characterType); Console.WriteLine("campType " + agentCla.campType); Console.ReadLine(); } }
运行
看结果有没有把数据赋值给 AgentClass 的实例,上面的方法是通用的,再创建个类试试
public class Car { public string name; public int wheel; public float speed; }
class Program { static void Main(string[] args) { AgentClass agentCla = AnalysisClass.GetTypeClass<AgentClass>(); //将字段打印出来 Console.WriteLine("agentID " + agentCla.agentID); Console.WriteLine("level " + agentCla.level); Console.WriteLine("blood " + agentCla.blood); Console.WriteLine("moveSpeed " + agentCla.moveSpeed); Console.WriteLine("power " + agentCla.power); Console.WriteLine("attackInterval " + agentCla.attackInterval); Console.WriteLine("characterType " + agentCla.characterType); Console.WriteLine("campType " + agentCla.campType); Console.WriteLine(); Car car = AnalysisClass.GetTypeClass<Car>(); Console.WriteLine("name " + car.name); Console.WriteLine("wheel " + car.wheel); Console.WriteLine("speed " + car.speed); Console.ReadLine(); } }
运行结果
上面仅仅是测试代码,项目中要根据实际情况加以修改
相关文章推荐
- C# FormHbitmap OutofMemoryException(内存溢出)解决方案
- C# 理解泛型
- OC#import和#include的异同
- C# WinForm窗体及其控件的分辨率自适应
- C#第二天
- C#笔记
- C#单元测试Nunit小结(20141018)
- C#的Timer
- 窗体间传值
- c#
- 9-19笔试
- c#+AE开发一些常用到的方法
- ae+C#实现图层管理控件上的图层移动功能
- 使用C# 与Xero OAuth 交互 集成
- C# 设置MDI子窗体只能弹出一个的方法
- C# 启动外部程序的几种常用方法汇总
- 对DevExpress GridControl控件,实现通过checkbox选中时整行高亮
- C#基础知识系列四(运算符汇总)
- C#中string.Empty和""、null的区别
- C#创建和初始化类