首页 > 编程语言 >C#反射使用

C#反射使用

时间:2024-04-18 16:34:42浏览次数:26  
标签:反射 Console C# testClass testCase BindingFlags WriteLine 使用 MethodInfo

using System.Reflection;

namespace TestReflection
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("TestReflection");
            Console.WriteLine("****************************************");
            Console.WriteLine("****************************************");

            #region dll加载与反射
            //加载dll获取程序集
            Assembly dllAssembly = Assembly.LoadFrom("IndustryLib.dll");

            //获取程序集中所有类型
            Type[] dlltypes = dllAssembly.GetTypes();
            foreach (Type type in dlltypes) { Console.WriteLine(type.Namespace + "." + type.Name); }
            Console.WriteLine("****************************************");

            //实例化指定类型
            Type classType = dllAssembly.GetType("IndustryLib.DataConvert.DataConvert");
            object classObj = Activator.CreateInstance(classType);
            Console.WriteLine("****************************************");

            //获取类中所有方法及参数
            MethodInfo[] methods = classType.GetMethods();
            foreach (MethodInfo method in methods) { method.GetParameters().ToArray().ToList().ForEach(p => Console.WriteLine(method.Name + ":" + p.Name + "," + p.ParameterType.Name + ",")); }
            Console.WriteLine("****************************************");

            //调用方法
            MethodInfo methodInfo = classType.GetMethod("StringToIntArray");
            object result = methodInfo.Invoke(classObj, new object[] { "12345" });
            foreach (int i in result as int[]) { Console.Write(i.ToString("x") + " "); }
            Console.WriteLine();
            Console.WriteLine("****************************************");
            Console.WriteLine("****************************************");
            #endregion

            #region 类加载反射
            TestReflectionClass testCase = new TestReflectionClass() { publicUnStatic = 5 };
            TestReflectionClass.publicStatic = 10;

            //获得指定类型所在程序集
            Assembly testClassAssembly = Assembly.GetAssembly(typeof(TestReflection.TestReflectionClass));

            //获取测试类型
            Type testClass = testClassAssembly.GetType("TestReflection.TestReflectionClass");


            //获取所有public字段
            FieldInfo[] publicFields = testClass.GetFields();
            foreach (FieldInfo field in publicFields) { Console.WriteLine(field.Name); }
            Console.WriteLine("****************************************");

            //获取所有private非static字段
            FieldInfo[] privateFields = testClass.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
            foreach (FieldInfo field in privateFields) { Console.WriteLine(field.Name); }
            Console.WriteLine("****************************************");

            //获取所有private static字段
            FieldInfo[] privateStaticFields = testClass.GetFields(BindingFlags.NonPublic | BindingFlags.Static);
            foreach (FieldInfo field in privateStaticFields) { Console.WriteLine(field.Name); }
            Console.WriteLine("****************************************");

            //获取public非static字段
            FieldInfo publicUnstaticField = testClass.GetField("publicUnStatic");
            Console.WriteLine("publicUnstaticField value:" + publicUnstaticField.GetValue(testCase));
            Console.WriteLine("****************************************");

            //获取public static字段
            FieldInfo publicStaticField = testClass.GetField("publicStatic");
            Console.WriteLine("publicStaticField ByInstance value:" + publicStaticField.GetValue(testCase));
            Console.WriteLine("publicStaticField ByClass value:" + publicStaticField.GetValue(null));
            Console.WriteLine("****************************************");

            //获取private非static字段
            FieldInfo privateUnstaticField = testClass.GetField("privateUnStatic", BindingFlags.Instance | BindingFlags.NonPublic);
            Console.WriteLine("privateUnstaticField value:" + privateUnstaticField.GetValue(testCase));
            Console.WriteLine("****************************************");

            //获取private static字段
            FieldInfo privateStaticField = testClass.GetField("privateStatic", BindingFlags.Static | BindingFlags.NonPublic);
            Console.WriteLine("privateStaticField ByInstance value:" + privateStaticField.GetValue(testCase));
            Console.WriteLine("privateStaticField ByClass value:" + privateStaticField.GetValue(null));
            privateStaticField.SetValue(null, 100);
            Console.WriteLine("privateStaticField after Set:" + privateStaticField.GetValue(null));
            Console.WriteLine("****************************************");
            Console.WriteLine("****************************************");


            //获取所有属性
            PropertyInfo[] properties = testClass.GetProperties();
            foreach (PropertyInfo property in properties) { Console.WriteLine(property.Name); }
            Console.WriteLine("property value:" + testClass.GetProperty("PublicProperty").GetValue(testCase));
            testClass.GetProperty("PublicProperty").SetValue(testCase, 100);
            Console.WriteLine("property value:" + testClass.GetProperty("PublicProperty").GetValue(testCase));
            Console.WriteLine("****************************************");
            Console.WriteLine("****************************************");

            //获取所有public方法
            MethodInfo[] publicMethods = testClass.GetMethods();
            foreach (MethodInfo method in publicMethods) { Console.WriteLine(method.Name); }
            Console.WriteLine("****************************************");

            //获取所有private方法
            MethodInfo[] privateMethods = testClass.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance);
            foreach (MethodInfo method in privateMethods) { Console.WriteLine(method.Name); }
            Console.WriteLine("****************************************");

            //反射调用公共普通方法
            MethodInfo testFunc1 = testClass.GetMethod("TestFunc");
            testFunc1.Invoke(testCase, null);
            Console.WriteLine("****************************************");

            //反射调用公共带参方法
            MethodInfo testFunc2 = testClass.GetMethod("TestFuncWithParam");
            Console.WriteLine(testFunc2.Invoke(testCase, new object[] { "Hello" }));
            Console.WriteLine("****************************************");

            //反射调用私有普通方法
            MethodInfo testFuncp1 = testClass.GetMethod("PTestFunc", BindingFlags.NonPublic | BindingFlags.Instance);
            testFuncp1.Invoke(testCase, null);
            Console.WriteLine("****************************************");

            //反射调用私有带参方法
            MethodInfo testFuncp2 = testClass.GetMethod("PTestFuncWithParam", BindingFlags.NonPublic | BindingFlags.Instance);
            Console.WriteLine(testFuncp2.Invoke(testCase, new object[] { "Hello" }));
            Console.WriteLine("****************************************");
            #endregion

            Console.WriteLine();
            Console.ReadKey();
        }
    }

    public class TestReflectionClass
    {
        /// <summary>
        /// 私有字段
        /// </summary>
        private int privateUnStatic;
        /// <summary>
        /// 私有静态字段
        /// </summary>
        private static int privateStatic;

        /// <summary>
        /// 公共字段
        /// </summary>
        public int publicUnStatic;
        /// <summary>
        /// 公共静态字段
        /// </summary>
        public static int publicStatic;

        /// <summary>
        /// 公共属性
        /// </summary>
        public int PublicProperty
        {
            set
            {
                privateUnStatic = value;
                Console.WriteLine("PublicProperty Set 已执行");
            }
            get
            {
                Console.WriteLine("PublicProperty Get 已执行");
                return privateUnStatic;
            }
        }

        /// <summary>
        /// 公共无参方法
        /// </summary>
        public void TestFunc()
        {
            Console.WriteLine("公共无参方法已执行");
        }

        /// <summary>
        /// 公共有参方法
        /// </summary>
        public int TestFuncWithParam(string msg) { Console.WriteLine("公共有参方法已执行:" + msg); return 4; }

        /// <summary>
        /// 私有无参方法
        /// </summary>
        private void PTestFunc()
        {
            Console.WriteLine("私有无参方法已执行");
        }

        /// <summary>
        /// 私有有参方法
        /// </summary>
        private int PTestFuncWithParam(string msg) { Console.WriteLine("私有有参方法已执行:" + msg); return 14; }
    }
}

 

标签:反射,Console,C#,testClass,testCase,BindingFlags,WriteLine,使用,MethodInfo
From: https://www.cnblogs.com/REGO101100/p/18143798

相关文章

  • 应急响应靶场Where-1S-tHe-Hacker
    应急响应实战靶场打开靶机,发现有两个用户,admin和admin$,一个是隐藏用户admin用户的密码是Aa123456杀软查杀进入主机,我们直接使用D盾和D-eyes杀软进行后台扫描,节省时间这边附上绿盟科技的D-Eyes的使用参数说明####Windows请以管理员身份运行cmd,之后再输入D-Eyes路径运......
  • GPG4win 使用笔记
    简介:Gpg4win是一套文件或email加密解密的安全方案。Gpg4win-asecuresolutionforfileandemailencryption.Gpg4win(GNUPrivacyGuardforWindows)isFreeSoftwareandcanbeinstalledwithjustafewmouseclicks安装:首先,从GPG4win官方网站下载安装程序 ht......
  • leedcode-判断子序列
    自己写的,有点麻烦classSolution:defisSubsequence(self,s:str,t:str)->bool:#第一步先验证s是t的无序子序列#使用字典记录t中每个字符的出现次数mydict=dict()foriint:ifnotmydict.get(i):......
  • json反序列化 JsonConvert.DeserializeObject 报错 One or more errors occurred. (U
    接口返回的字符串肉眼看起来正常,也是标准json,反序列化时候报错,字符串添加了UTF8-BOM头(windows记事本默认编码),可以通过以下代码移除标头//模拟json字符串对象varjsonStr="{}";byte[]buffer=Encoding.UTF8.GetBytes(jsonStr);varsResult=Encoding.UTF8.GetString......
  • pandas读取sql文件出现:告警UserWarning: pandas only supports SQLAlchemy connectabl
    ​错误原因:导入sql的方式更新了解决方法:importpandasaspdfromsqlalchemyimportcreate_engineMYSQL_HOST='localhost'MYSQL_PORT='3306'MYSQL_USER='root'MYSQL_PASSWORD='123456'MYSQL_DB='cldk_data'engine=......
  • v-for 一定要绑定key值吗?为什么不建议使用index?
    在vue进行循环的数组或者对象中,使用了v-for进行dom元素的渲染。当数组或对象中的值发生变化时,可能会使dom元素重新渲染。是否会重新渲染和我们设置的key属性对应的值有关合理的设置key属性的值可以有效的提高页面的的更新效率首先,vue使用了diff算法来进行dom元素的更新,diff算......
  • lsyncd+rsync实时备份
    数据实时备份这里采用lsyncd+rsync实现服务器之间数据实时同步服务端配置备份服务器执行这个脚本,确保服务启动#配置rsyncd服务端的全部流程,也可以写成脚本,一键安装#/bin/bashyuminstallrsync-ycat>/etc/rsyncd.conf<<'EOF'uid=wwwgid=wwwport=873fake......
  • Effective Python:第7条 尽量用enumerate取代range
    Python有个内置的函数,叫作enumerate。enumerate能够把任何一种迭代器(iterator)封装成惰性生成器(lazygenerator)。这样的话,每次循环的时候,它只需要从iterator里面获取下一个值就行了,同时还会给出本轮循环的序号,即生成器每次产生的一对输出值。下面通过内置的next函数手动推进enumera......
  • ElasticSearch
    分布式搜索技术倒排索引ElasticSearch采用倒排索引1、文档(document):每条数据就是一个文档2、词条(term):文档按照语义分成的词语。不可重复MySQL擅长事务类型操作,可以确保数据的安全和一致性。ElasticSearch擅长海量数据的搜索、分析、计算。单机安装dockernetwor......
  • JTCR-枚举、装箱和注解-10
    枚举枚举定义了一个数据类型和该数据类型允许的若干个值,这些值为命名常量。一个枚举实例的值必须是定义的值。Java中,枚举是类类型,可以有构造器、方法和实例变量,甚至实现接口。但不能使用new实例化。enumName{value1,value2,...}//定义Namen=Name.value1;//......