[c#]反射

 【Unity|C#】基础篇(12)——反射(Reflection)(核心类:Type、Assembly) - 夏天的风92 - 博客园 (cnblogs.com)

using System;
using System.Reflection;

namespace 反射
{
    /// <summary>
    /// 
    /// 反射基本信息:
    /// exe/dll 主要区别就是EXE文件有入口,---metadata 元数据(描述exe/dll 文件的 一个数据清单)--反射  (Reflection)用来操作元数
    /// 【1】更新程序时(更新自己的DLL)
    /// 【2】使用别人的DLL 文件(这种可以读取别人私有的东西)
    /// 
    /// 反射是什么?他就是一个操作metadata的一个类库(可以把反射当做一个工具用来读取或者操作元数据时)
    ///            类,方法,属性字段,特性(为什么使用反射间接去操作  1--因为我们需要动态  2--读取私有对象)
    ///            
    /// 几乎所有的框架都会用到反射
    /// 
    /// 可以把反射理解为反射工具   操作元数据的工具
    /// 
    /// 通过反射加载dll
    /// 
    /// 使用反射创建对象
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            //Assembly assembly = Assembly.LoadFile(@"D:\C#\反射\泛型\bin\Debug\netcoreapp3.1\泛型.dll");//加载方法一  通过路径
            //Assembly assembly = Assembly.LoadFile("泛型"); //文件名    
            //Assembly assembly = Assembly.LoadFrom("泛型"); //文件名    
            #region 通过反射加载dll

            Assembly assembly = Assembly.LoadFrom(@"D:\C#\反射\泛型\bin\Debug\netcoreapp3.1\泛型.dll"); //文件路径  
            foreach (var type in assembly.GetTypes())//查找所有类型(class)
            {
                Console.WriteLine(type.Name);
                foreach (var method in type.GetMethods())//类型写下面的方法
                {
                    Console.WriteLine("这是方法:" + method);
                }
            }
            #endregion

            #region  通过反射创建对象 调用dll私有(带参数)方法   获取(私有)属性  修改属性值 获取属性值
            Assembly assembly = Assembly.LoadFrom(@"D:\C#\反射\泛型\bin\Debug\netcoreapp3.1\泛型.dll");//加载
            Type type = assembly.GetType("泛型.Student2");//获取类型  必须通过命名空间.类型(类)
            object student = Activator.CreateInstance(type);//创建对象  相当于  Student student= new Student();
            //var m= type.GetMethod("Info").Invoke(student,null); //使用对象调用公开方法
            //var m= type.GetMethod("Info").Invoke(student,new Object[]{11}); //使用对象调用带参数方法
            //其他的还有 获取属性 
            var m = type.GetMethod("Info", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(student, null);//使用对象调用私有方法  
            PropertyInfo name = type.GetProperty("Name", BindingFlags.Instance | BindingFlags.NonPublic);
            //设置属性值
            name.SetValue(student, "大姑娘", null);
            //获取属性值
            name.GetValue(student, null);
            #endregion

            #region  使用反射创建对象(带参数的构造函数)
            Assembly assembly = Assembly.LoadFrom(@"D:\C#\反射\泛型\bin\Debug\netcoreapp3.1\泛型.dll");//加载
            Type type = assembly.GetType("泛型.Student2");//获取类型  必须通过命名空间.类型(类)
            object student = Activator.CreateInstance(type, new object[] { "aa" });//创建带参数的对象  
            var m = type.GetMethod("Info", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(student, null);//使用对象调用私有方法  
            #endregion
            #region  使用反射创建对象(私有构造函数)
            Assembly assembly = Assembly.LoadFrom(@"D:\C#\反射\泛型\bin\Debug\netcoreapp3.1\泛型.dll");//加载
            Type type = assembly.GetType("泛型.Student2");//获取类型  必须通过命名空间.类型(类)
            object student = Activator.CreateInstance(type, true);//创建私有构造函数的对象 
            var m = type.GetMethod("Info", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(student, null);//使用对象调用私有方法  
            #endregion
            #region  使用反射创泛型类
            Assembly assembly = Assembly.LoadFrom(@"D:\C#\反射\泛型\bin\Debug\netcoreapp3.1\泛型.dll");//加载DLL文件
            Type type = assembly.GetType("泛型.TClass`3");//获取类型  必须通过命名空间.类型(类)  这个 `是泛型的占位符  在键盘的数字左边波浪线按键
            Type makeType = type.MakeGenericType(new Type[] { typeof(string), typeof(int), typeof(int) });//为泛型方法和泛型类指定具体类型
            object student = Activator.CreateInstance(makeType);
            #endregion

            #region  通过反射调用泛型方法
            Assembly assembly = Assembly.LoadFrom(@"D:\C#\反射\泛型\bin\Debug\netcoreapp3.1\泛型.dll");//加载DLL文件
            Type type = assembly.GetType("泛型.TClasss");//获取类型  必须通过命名空间.类型(类)  这个 `是泛型的占位符  在键盘的数字左边波浪线按键
            object ins = Activator.CreateInstance(type);
            MethodInfo mi = type.GetMethod("TClass");
            mi.MakeGenericMethod(new Type[] { typeof(int), typeof(string) }).Invoke(ins, new object[] { 2, "aa" });
            #endregion
            #region  通过反射调用泛型类型的泛型方法
            Assembly assembly = Assembly.LoadFrom(@"D:\C#\反射\泛型\bin\Debug\netcoreapp3.1\泛型.dll");//加载DLL文件
            Type type = assembly.GetType("泛型.TClassss`1");//获取类型  必须通过命名空间.类型(类)  这个 `是泛型的占位符  在键盘的数字左边波浪线按键
            Type newType= type.MakeGenericType(new Type[] { typeof(int) });
            object ins = Activator.CreateInstance(newType);
            MethodInfo mi = type.GetMethod("TClass");
            MethodInfo info=mi.MakeGenericMethod(new Type[] { typeof(int), typeof(string) });
            info. Invoke(ins, new object[] { 2, "aa" });
            #endregion
        }
    }
}

dll

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DAGUNIANGZHOU

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

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

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

打赏作者

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

抵扣说明:

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

余额充值