反射在项目开发的过程中使用的还是非常非常多的,但凡你想写一些偷懒或者说看起来很精巧的代码,都会或多或少的涉及到反射。
动态实例化对象?动态获取对象中的属性值?动态调用对象中的方法?嗯,都可以,但不止。.
这一篇呢,也就是先简单的介绍下利用反射动态获取类中的一些基本的成员信息,如:公共成员、私有成员;获取到这些成员信息后,就可以从其中取出所需要的属性进行使用,如属性、字段、方法、事件、枚举、特性等。
此篇直接反射了类中的一些信息,下一篇我们再来实例化一个对象,用来动态获取其中的属性值以及方法调用等。
实现功能:
- 反射获取类中的成员信息
开发环境:
- 开发工具:Visual Studio 2013
- .NET Framework版本:4.5
实现代码:
public class Model
{
private string privateField;
public string publicField;
private string privateProperty { get; set; }
public string publicProperty { get; set; }
private void privateMethod()
{
}
public void publicMethod()
{
}
private event EventHandler privateEvent;
public event EventHandler publicEvent;
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Type type = typeof(Model);
private void Form1_Load(object sender, EventArgs e)
{
listBox1.Items.Add(type.Assembly.FullName);
}
private void btn_Member_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
listBox1.Items.Add("获取公共成员");
var ps = type.GetMembers().ToList();
ps.ForEach(s =>
{
listBox1.Items.Add("名称:" + s.Name + ";类型:" + s.MemberType);
});
listBox1.Items.Add("获取私有成员");
ps = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Instance).ToList();
ps.ForEach(s =>
{
listBox1.Items.Add("名称:" + s.Name + ";类型:" + s.MemberType);
});
}
private void btn_Property_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
listBox1.Items.Add("获取公共属性");
var ps = type.GetProperties().ToList();
ps.ForEach(s =>
{
listBox1.Items.Add("名称:" + s.Name + ";类型:" + s.PropertyType);
});
listBox1.Items.Add("获取私有属性");
ps = type.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance).ToList();
ps.ForEach(s =>
{
listBox1.Items.Add("名称:" + s.Name + ";类型:" + s.PropertyType);
});
}
private void btn_Method_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
listBox1.Items.Add("获取公共方法");
var ps = type.GetMethods().ToList();
ps.ForEach(s =>
{
listBox1.Items.Add("名称:" + s.Name + ";类型:" + s.ReturnType);
});
listBox1.Items.Add("获取私有方法");
ps = type.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance).ToList();
ps.ForEach(s =>
{
listBox1.Items.Add("名称:" + s.Name + ";类型:" + s.ReturnType);
});
}
private void btn_Field_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
listBox1.Items.Add("获取公共字段");
var ps = type.GetFields().ToList();
ps.ForEach(s =>
{
listBox1.Items.Add("名称:" + s.Name + ";类型:" + s.FieldType);
});
listBox1.Items.Add("获取私有字段");
ps = type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance).ToList();
ps.ForEach(s =>
{
listBox1.Items.Add("名称:" + s.Name + ";类型:" + s.FieldType);
});
}
private void btn_Event_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
listBox1.Items.Add("获取公共事件");
var ps = type.GetEvents().ToList();
ps.ForEach(s =>
{
listBox1.Items.Add("名称:" + s.Name + ";类型:" + s.EventHandlerType.Name);
});
listBox1.Items.Add("获取私有事件");
ps = type.GetEvents(BindingFlags.NonPublic | BindingFlags.Instance).ToList();
ps.ForEach(s =>
{
listBox1.Items.Add("名称:" + s.Name + ";类型:" + s.EventHandlerType.Name);
});
}
}
实现效果: