C# 反射实例 一
来源:互联网 发布:网络评选投票 编辑:程序博客网 时间:2024/06/11 12:38
C# 反射实例
下面例子是从一个项目中拿出来的一块代码,简要介绍下实际项目中如何使用反射
项目有个需求,策划把数据填写到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(); } }
运行结果
上面仅仅是测试代码,项目中要根据实际情况加以修改
0 0
- C# 反射实例 一
- C#反射实例讲解
- c# 反射使用实例
- C#反射实例讲解
- C#反射实例讲解
- C#反射实例讲解
- c# 反射实例
- C#反射实例讲解
- c# 反射使用实例
- C#反射实例讲解
- C#反射实例讲解
- C#反射实例讲解
- C#反射实例详解
- C#反射实例讲解
- C#反射实例讲解
- C#反射实例讲解
- C#反射实例调用
- C#反射实例讲解
- HDU 4252A Famous City
- 删除字符串中连续字符
- leetcode刷题,总结,记录,备忘 283
- Effective C++ —— 别让异常逃离析构函数
- Struts、hibernate、Spring 官网下载步骤
- C# 反射实例 一
- iOS中Bitcode的介绍及配置
- SQL Server数据库
- Python 标准库——collections(下)
- 关于ListView触摸事件和点击Item事件冲突解决方法
- [速报酱]速报酱团队第一周
- 嵌入式Linux系统内核Kernel(裁减移植)启动调试技术(回顾)
- 深入浅出:MySQL的左连接、右连接、等值连接
- Android应用程序用户界面(十一)时间日期选择对话框