美文网首页
反射和程序集

反射和程序集

作者: 山猪打不过家猪 | 来源:发表于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方法

相关文章

  • 反射和程序集

    反射 反射就是一个操作metadata元数据的一个类库(可以把反射当做一个小工具来读取或者操作元数据的,类,方法,...

  • 如何做一个简单的Android注解框架(JBInject)

    反射(Reflect) 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。...

  • C#使用反射加载多个程序集

    C#使用反射加载多个程序集 当开发插件的时候需要用到反射,在客户端动态加载遍历程序集,并调用每个程序集的方法。 创...

  • C#反射

    C# 反射(Reflection) 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。程序集包含模块,而模...

  • Kotlin/Java中的反射详解

    什么是反射 反射是一种计算机处理方式。有程序可以访问、检测和修改它本身状态或行为的这种能力。能提供封装程序集、类型...

  • Kotlin/Java中的反射机制

    什么是反射 反射是一种计算机处理方式。有程序可以访问、检测和修改它本身状态或行为的这种能力。能提供封装程序集、类型...

  • 如何利用反射获取当前程序集指定类型的信息

    如何利用反射获取当前程序集指定类型的信息

  • C# 利用反射根据类名创建类的实例对象

    “反射”其实就是利用程序集的元数据信息。 反射可以有很多方法,编写程序时请先导入 System.Reflectio...

  • 2018-08-10 反射

    1.简介 反射 提供了封装程序集、模块和类型的对象(Type类型)。可以使用反射动态创建类型的实例,将类型绑定到现...

  • 2019-12-17,反射

    反射提供描述程序集、模块和类型的对象(Type 类型)。可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或...

网友评论

      本文标题:反射和程序集

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