2.C# 反射的使用

通过对一个类的操作,分别展示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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kerven_HKW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值