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 { List animals = 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
    {

    }
}

以上仅供参考