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
原创粉丝点击