C#反射使用示例
分享一下自己写的使用反射的例子,包括根据名字获取属性值、字段(类的示例对,如自己申明的类或者list等)、调用函数(无参、有参),界面如下:
贴上代码:
namespace RelectionTest { public class Person { public string name { get ; set; } public int age = 16; public Men li = new Men("李四");
private int weight = 110; public List<string> friends =new List<string>(){ "aa", "bb","cc","dd" }; public List<int> friendage = new List<int>() { 15, 14}; } public class Men { public string name; public Men(string name) { this.name = name; } } } namespace RelectionTest { public partial class Form1 : Form { Listanimals = new List (); public Form1() { InitializeComponent(); } private void Button1_Click(object sender, EventArgs e) { Person person = new Person(); person.name = "张三"; Type t = person.GetType(); //获取属性值 PropertyInfo property = t.GetProperty("name"); richTextBox2.AppendText(property.GetValue(person).ToString()+"\n");
//获取私有变量
FieldInfo weight = t.GetField("weight",BindingFlags.NonPublic|BindingFlags.Instance);
richTextBox2.AppendText(weight.GetValue(person).ToString() + "\n");
//获取list值 FieldInfo fi = t.GetField("friends");//list类型 var listVal = fi.GetValue(person) as IEnumerable<string>; foreach (var aa in listVal) { richTextBox2.AppendText(aa.ToString() + "\n"); } //获取list值 FieldInfo fa = t.GetField("friendage");//list类型 var list = fa.GetValue(person) as IEnumerable<int>; foreach(var aa in list) { richTextBox2.AppendText(aa.ToString() + "\n"); } //获取字段值 FieldInfo age = t.GetField("age"); richTextBox2.AppendText(age.GetValue(person).ToString() + "\n"); //获取字段值 FieldInfo man = t.GetField("li"); richTextBox2.AppendText((man.GetValue(person) as Men).name + "\n"); //获取所有字段 FieldInfo[] fis = t.GetFields(); foreach (var item in fis) { richTextBox1.AppendText(item.ToString() + "\n"); } } public void Func1(string str) { richTextBox1.AppendText(str); } public void Func2(List<string> list) { foreach(string item in list) { richTextBox1.AppendText(item + "\n"); } } //根据方法名调用方法,参数为list时 public void CallFunc(string funcName,IEnumerable<string> list) { MethodInfo methodInfo = this.GetType().GetMethod(funcName); object[] obj = new object[] { list }; methodInfo.Invoke(this, obj); } //根据方法名调用方法,参数为string时 public void CallFunc(string funcName) { MethodInfo methodInfo = this.GetType().GetMethod(funcName); object[] obj = new object[] { "123456789" }; methodInfo.Invoke(this, obj); } public void Do() { Person person = new Person(); person.name = "张三"; Type t = person.GetType(); FieldInfo fi = t.GetField("friends"); var listVal = fi.GetValue(person) as IEnumerable<string>; CallFunc("Func2", listVal); CallFunc("Func1"); } private void Button2_Click(object sender, EventArgs e) { Do(); InitClass(typeof(Dot), 10); richTextBox2.AppendText(animals.Count.ToString() + "\n"); } public void InitClass(Type type, int count)//根据类实例对应个数 { for (int i = 0; i < count; i++) { animals.Add(Activator.CreateInstance(type) as Animal); } } } public abstract class Animal { } public class Dot : Animal { } }
以上仅供参考