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

c#反射的学习

2009-02-06 21:27 323 查看
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
//反射:动态的读取类中的成员,动态的执行方法
namespace RelectionTest
{
//性别枚举
enum Gender
{
男,女
}
//学生类
class Student
{
public string studentName;//学生姓名
public Gender studentsGender;//学生性别
//构造方法
public Student(string sName,Gender sGender)
{
studentName = sName;
studentsGender = sGender;
}
}
//课程类
class Course
{
public string courseName;//课程名称
public string courseTeacherName;//课程教师
//构造方法
public Course(string sCName,string sCTName)
{
courseName = sCName;
courseTeacherName = sCTName;
}
}
//成绩类
class Score
{
public Student student;//学生
public Course course;//课程
public int mark;//成绩
//构造方法
public Score(Student stu, Course cur, int imark)
{
student = stu;
course = cur;
mark = imark;
}
}
//初始化学生,课程,成绩信息
class Data
{
//成绩数据以字段呈现
public Score score1;
public Score score2;
public Score score3;
public Score score4;

//学生数据以属性呈现
private Student stu1;
private Student stu2;

//课程数据以方法返回
private Course cou1;
private Course cou2;

//属性封装了字段
public Student Stu1
{
get{return stu1;}
}
public Student Stu2
{
get { return stu2;}
}
//构造方法 用于初始化数据
public Data()
{
stu1 = new Student("小树",Gender.女);
stu2 = new Student ("大名", Gender.男);
cou1 = new Course("课程a","老猪");
cou2 = new Course("课程b","老万");
score1 = new Score(stu1, cou1, 99);
score2 = new Score(stu1, cou2, 77);
score3 = new Score(stu2, cou1, 88);
score4 = new Score(stu2, cou2, 66);
}
//公有方法,返回课程数据
public Course GetCourse1()
{
return cou1;
}
public Course GetCourse2()
{
return cou2;
}
}

class ReflectionHelper
{
private Data data = new Data();
//使用反射遍历对象的成员(字段,属性,方法等)
public void ListMember()
{
Console.WriteLine("-------------------遍历对象的成员---------------------");
Console.WriteLine("成员名/t/t成员类型/t/t声明成员的类");
//成员遍历
MemberInfo[] arr = data .GetType ().GetMembers ();
foreach (MemberInfo mi in arr)
{
Console.WriteLine(string.Format ("{0}/t{1}/t{2}",mi.Name.PadRight (10,' '),mi.MemberType .ToString ().PadRight(10,' '),mi.DeclaringType .ToString ().PadRight(10,' ')));
}
}
//使用反射遍历对象的字段
public void ListScore()
{
Console.WriteLine("----------------------------成绩数据-------------------------");
Console.WriteLine("姓名/t性别/t课程名/t授课教师/t成绩");
//字段
FieldInfo[] arrSorce = data.GetType().GetFields();
foreach (FieldInfo fi in arrSorce)
{
//读取字段的值
Score score = (Score)fi.GetValue(data);
Console.WriteLine(string.Format("{0}/t{1}/t{2}/t{3}/t{4}", score.student.studentName, score.student.studentsGender, score.course.courseName, score.course.courseTeacherName, score.mark));
}
}
//使用反射遍历对象的属性
public void ListStudent()
{
Console.WriteLine("------学生表-------");
Console.WriteLine("姓名/t性别");
// 属性
PropertyInfo[] arrstu = data.GetType().GetProperties();
foreach (PropertyInfo pi in arrstu)
{
//读取属性的值
Student stu = (Student)pi.GetValue(data,null);
Console.WriteLine(string.Format ("{0}/t{1}",stu.studentName,stu.studentsGender));
}
}
//反射对象的方法
public void ListCourse()
{
Console.WriteLine("----------课程数据------------");
Console.WriteLine("课程名/t授课老师");
//方法
MethodInfo[] arrCourse = data.GetType().GetMethods();
foreach (MethodInfo mi in arrCourse)
{
//判断是否时获取课程的方法
if (mi.Name.IndexOf("GetCourse") > -1)
{
//执行方法
Course course = mi.Invoke(data, null) as Course;
Console.WriteLine(string.Format("{0}/t{1}", course.courseName, course.courseTeacherName));
}
}
}
}
class Program
{
static void Main(string[] args)
{
ReflectionHelper rh = new ReflectionHelper();
rh.ListMember();
rh.ListScore();
rh.ListStudent();
rh.ListCourse();
Console.ReadKey();
}
}
}


//
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: