C# 反射的使用

倖福魔咒の 提交于 2020-01-16 03:17:21

通过对一个类的操作,分别展示C#反射各个方法的使用。

// 通过程序集名称返回Assembly对象

// 通过Assembly获取程序集中类,参数必须是类的全名

// GetMethod获取类方法

// GetProperty获取有get和set封装的字段

// GetField获取公有字段

// GetField获取私有字段

// Activator.CreateInstance创建类实例

using System;
using System.Reflection;

namespace CSharpTest01
{
    class Contact
    {
        // Read-only properties.  
        public string Name { get; private set; }
        public string Address { get; private set; }

        public string m_sMail;
        int id;

        // Public constructor.  
        public Contact()
        {

        }
        public Contact(string contactName, string contactAddress, string mail, int ID)
        {
            Name = contactName;
            Address = contactAddress;
            m_sMail = mail;
            id = ID;
        }
        public void Print()
        {
            Console.WriteLine("Name:" + Name + " Address:" + Address + "m_sMail" + m_sMail + "id" + id);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("1.通过程序集的名称反射");
            // 通过程序集名称返回Assembly对象
            Assembly ass = Assembly.Load("CSharpTest01");
            // 通过Assembly获取程序集中类,参数必须是类的全名
            Type t = ass.GetType("CSharpTest01.Contact");

            // 创建一个类
            Contact contact = new Contact("kerven", "123", "123@qq.com", 2001);

            // GetMethod获取类方法
            MethodInfo mi = t.GetMethod("Print");
            mi.Invoke(contact, null);
            contact.Print();

            // GetProperty获取有get和set封装的字段
            object name = "newName";
            t.GetProperty("Name").SetValue(contact, name);
            mi.Invoke(contact, null);
            contact.Print();

            // GetField获取公有字段
            object mail = "456@163.com";
            t.GetField("m_sMail").SetValue(contact, mail);
            mi.Invoke(contact, null);
            contact.Print();

            // GetField获取私有字段
            int numID = 9999;
            FieldInfo fi = t.GetField("id", BindingFlags.NonPublic | BindingFlags.Instance);
            fi.SetValue(contact, numID);
            mi.Invoke(contact, null);
            contact.Print();

            // Activator.CreateInstance创建类实例
            object o = Activator.CreateInstance(t, "name", "stringStr", "123@qq.com", 1001);
            MethodInfo print = t.GetMethod("Print");
            print.Invoke(o, null);

            t.InvokeMember("Print", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance,
                null, contact, null);

            Console.ReadKey();
        }
    }
}

另附一个不错的讲解反射的博客文章:

https://www.cnblogs.com/huangcong/archive/2010/05/15/1736127.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!