美文网首页
反射和程序集

反射和程序集

作者: 山猪打不过家猪 | 来源:发表于2022-07-18 15:25 被阅读0次

    反射

    • 反射就是一个操作metadata元数据的一个类库(可以把反射当做一个小工具来读取或者操作元数据的,类,方法,属性,特性,字段)
    • 使用场合
      asp.net MVC,ORM, LOC几乎所有框架都会用到反射
      1.更新程序时,自己更新dll
      2.使用别人的dll文件
    反射获取类信息(命名空间,全名)
    {
        class Program
        {
            static void Main(string[] args)
            {
                //方法一:通过typeod操作符
                Type T1 = typeof(Person);
                //方法二:通过类型的实例
                Type T2 = new Person().GetType();
                //方法三:通过静态方法
                Type T3 = Type.GetType("System.IO.Stream");
                Console.WriteLine("命名空间名称:" + T1.Namespace);
                Console.WriteLine("直接基类型:" + T1.BaseType);
                Console.WriteLine("全名:" + T1.FullName);
                Console.WriteLine("是抽象类型:" + T1.IsAbstract);
                Console.WriteLine("是否是类:" + T1.IsClass);
            }
    
            public class Person
            {
                public string Name { get; set; }
                public int Age { get; set; }
                
                public void sayHello()
                {
                    Console.WriteLine($"My name is{this.Name}");
                }
            }
        }
    }
    
    >>>
    命名空间名称:test2
    直接基类型:System.Object
    全名:test2.Program+Person
    是抽象类型:False
    是否是类:True
    
    获取类成员信息(方法,属性)
    static void Main(string[] args)
            {
    
                Person p1 = new Person();
                p1.Name = "Fxx";
                p1.Age = 10;
    
                Type T1 = typeof(Person);
                var Mets = T1.GetMembers();
                foreach (var item in Mets)
                {
                    Console.WriteLine("【" + item.MemberType.ToString() + "】:" + item.Name);
                }
            }
    >>>
    【Method】:get_Name
    【Method】:set_Name
    【Method】:get_Age
    【Method】:set_Age
    【Method】:sayHello
    【Method】:GetType
    【Method】:ToString
    【Method】:Equals
    【Method】:GetHashCode
    【Constructor】:.ctor
    【Property】:Name
    【Property】:Age
    
    
    动态调用方法

    -方法一:

    namespace test2
    {
        class Program
        {
            static void Main(string[] args)
            {
                //有参数调用
                Type T1 = typeof(TClass);
                T1.InvokeMember("fun", BindingFlags.InvokeMethod, null, new TClass(), new string[] { "我是参数" });
                //无参数调用
                Type T2 = typeof(TClass);
                T2.InvokeMember("fun2", BindingFlags.InvokeMethod, null, new TClass(), null);
                //调用静态方法
                Type T3 = typeof(TClass);
                T3.InvokeMember("fun3", BindingFlags.InvokeMethod, null, T3, null);
    
            }
    
    
            public class TClass
            {
                public void fun(string str)
                {
                    Console.WriteLine("我是fun有参方法,我被调用了。" + str);
                }
                public void fun2()
                {
                    Console.WriteLine("我是fun2无参方法,我被调用了。");
                }
                public static void fun3()
                {
                    Console.WriteLine("我是fun3静态方法,我被调用了");
                }
            }
        }
    }
    
    >>>
    我是fun有参方法,我被调用了。我是参数
    我是fun2无参方法,我被调用了。
    我是fun3静态方法,我被调用了
    
    • 方法二:
    static void Main(string[] args)
    {
        Type T1 = typeof(TClass);
        T1.GetMethod("fun", BindingFlags.Instance | BindingFlags.Public).Invoke(new TClass(), new string[] { "testfun1" });
        T1.GetMethod("fun2", BindingFlags.Instance | BindingFlags.Public).Invoke(new TClass(), null);
        T1.GetMethod("fun3", BindingFlags.Static | BindingFlags.Public).Invoke(T1, null);
    }
    
    

    程序集

    image.png
    namespace test2
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                     //加载方式一:dll文件名
                    //Assembly assembly = Assembly.Load("test2");
                    //加载方法二:完整路径名称
                    // Assembly assembly = Assembly.LoadFile(@"E:\myFirstC\ConsoleApp2\test2\bin\Debug\net5.0\test2.dll");
                    //加载方法三(推荐)
                    Assembly assembly = Assembly.LoadFrom("test2.dll");
                    foreach (var type in assembly.GetTypes())
                    {
                        Console.WriteLine(type.Name);
                        foreach (var method in type.GetMethods())
                        {
                            Console.WriteLine("这是"+method.Name+"方法")
                        }
                    }
    
                }
                catch (Exception e)
                {
    
                    Console.WriteLine(e);
                }
            }
        }
    }
    >>>
    这是GetType方法
    这是ToString方法
    这是Equals方法
    这是GetHashCode方法
    Person1
    这是sayHello方法
    这是sayAge方法
    这是GetType方法
    这是ToString方法
    这是Equals方法
    这是GetHashCode方法
    Person2
    这是sayHello方法
    这是sayAge方法
    这是GetType方法
    这是ToString方法
    这是Equals方法
    这是GetHashCode方法
    

    相关文章

      网友评论

          本文标题:反射和程序集

          本文链接:https://www.haomeiwen.com/subject/ihqdirtx.html