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();
}
}
运行结果
上面仅仅是测试代码,项目中要根据实际情况加以修改