反射和程序集

2022-07-18  本文已影响0人  山猪打不过家猪

反射

反射获取类信息(命名空间,全名)
{
    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方法
上一篇下一篇

猜你喜欢

热点阅读