您的位置:首页 > 编程语言 > C#

C# 反射实例 一

2015-09-20 13:10 621 查看
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();
}
}


运行结果



上面仅仅是测试代码,项目中要根据实际情况加以修改
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: