二、反射

一、DLL源文件

User:

    public class User
    {
        public string UserName { get; set; }
        private string Password { get; set; }
    }

 Student:

public class Student
    {
        public Student(string name)
        {
            Name = name;
        }
        public string TestFiled;

        public string Name { get; set; }
        public int Age { get; set; }
        public char Gender { get; set; }
        public string IdCard { get; set; }
        public string Address { get; set; }
        private string Mobile { get; set; }

        public void Introduce()
        {
            Console.WriteLine($"我的名字是{Name}!");
        }

        public string ChangeName(string newName)
        {
            Name = newName;
            return Name;
        }

        public void Eat()
        {
            Console.WriteLine("我今天吃啦好多东西");
        }
        public void Sing()
        {
            Console.WriteLine("耶耶耶耶耶");
        }
        public int Calculate(int a, int b)
        {
            return a + b;
        }
        private string PrivateMethod()
        {
            return "我是一个私有方法";
        }
    }

 

二、代码测试类

class Program
    {
        static void Main(string[] args)
        {
            Assembly assembly = Assembly.LoadFile(@"DLL绝对路径");
            WriteInfoForDll(assembly);
            PropertyAndMethodTest(assembly);
        }

        /// <summary>
        /// 属性与方法测试
        /// </summary>
        /// <param name="assembly"></param>
        private static void PropertyAndMethodTest(Assembly assembly)
        {
            //获取类定义
            Type studentType = assembly.GetType("StudentClass.Student");
            //根据类定义获取实例
            object student = Activator.CreateInstance(studentType, new object[] { "Bob" });
            //获取属性
            string propertyValue = studentType.InvokeMember("Name", BindingFlags.GetProperty, null, student, null).ToString();
            Console.WriteLine("改名前属性:" + propertyValue);
            //调用无参数函数
            studentType.InvokeMember("Introduce", BindingFlags.InvokeMethod, null, student, null);
            //调用有参数函数
            string newName = studentType.InvokeMember("ChangeName", BindingFlags.InvokeMethod, null, student, new object[] { "Alice" }).ToString();
            Console.WriteLine($"新名字{newName}!");
            //重新调用属性
            propertyValue = studentType.InvokeMember("Name", BindingFlags.GetProperty, null, student, null).ToString();
            Console.WriteLine("改名后属性:" + propertyValue);
        }

        /// <summary>
        /// DLL属性获取
        /// </summary>
        /// <param name="assembly"></param>
        private static void WriteInfoForDll(Assembly assembly)
        {
            Console.WriteLine("程序集名字:" + assembly.FullName);
            Console.WriteLine("程序集位置:" + assembly.Location);
            Console.WriteLine("运行程序集需要的额CLR版本:" + assembly.ImageRuntimeVersion);
            Console.WriteLine("====================================================");
            //获取模块信息
            Module[] modules = assembly.GetModules();
            foreach (Module item in modules)
            {
                Console.WriteLine("模块名称:" + item.Name);
                Console.WriteLine("模块版本ID" + item.ModuleVersionId);
            }
            Console.WriteLine("======================================================");
            //获取类,通过模块和程序集都可以
            Type[] types = assembly.GetTypes();
            foreach (Type item in types)
            {
                Console.WriteLine("类型的名称:" + item.Name);
                Console.WriteLine("类型的完全命名:" + item.FullName);
                Console.WriteLine("类型的类别:" + item.Attributes);
                Console.WriteLine("类型的GUID:" + item.GUID);
                Console.WriteLine("=====================================================");

                SeeClass(assembly, item.FullName);
            }
        }

        /// <summary>
        /// 查看成员信息
        /// </summary>
        /// <param name="assembly"></param>
        /// <param name="name"></param>
        public static void SeeClass(Assembly assembly, string name)
        {
            //获取主要类Student的成员信息等
            Type studentType = assembly.GetType(name);//完全命名
            MemberInfo[] mi = studentType.GetMembers();
            foreach (MemberInfo item in mi)
            {
                Console.WriteLine("成员的名称:" + item.Name);
                Console.WriteLine("成员类别:" + item.MemberType);
            }
            Console.WriteLine("=====================================");

            //获取方法
            BindingFlags flags = BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance;
            MethodInfo[] methodInfo = studentType.GetMethods(flags);
            foreach (MethodInfo item in methodInfo)
            {
                Console.WriteLine("public类型的,不包括基类继承的实例方法:" + item.Name);
            }
            Console.WriteLine("========================================");
            BindingFlags flag = BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic;
            MethodInfo[] methods = studentType.GetMethods(flag);
            foreach (MethodInfo item in methods)
            {
                Console.WriteLine("非public类型的,不包括基类继承的实例方法:" + item.Name);
            }
            Console.WriteLine("========================================");

            //获取属性
            BindingFlags flags2 = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.Instance;
            PropertyInfo[] pi = studentType.GetProperties(flags2);
            foreach (PropertyInfo item in pi)
            {
                Console.WriteLine("属性名称:" + item.Name);
            }
            Console.WriteLine("========================================");
        }
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值