C# 类型反射

反射
反射(reflection)是一个运行库类型发现的过程。与其他命名空间一样,System.Reflection
包含了大量相关类型;
在这里插入图片描述
为了说明反射的基本过程,建立一个名为MyTypeViewer的控制台程序,这个程序将显示[mscorlib.dll]和MyTypeViewer中类型的方法、属性、字段和支持的接口,创建好这个应用程序后,还要确保引用System.Reflection命名空间。

// 需要为反射导入泛型命名空间
using System.Reflection;

反射的方法
修饰Program类,定义一些静态方法,每个都带有一个System.Type参数并返回void类型。首先,编写ListMethods()方法。注意Type.GetMethods()如何返回一个System.Reflection.MethodInfo类型的数组,它使用标准的foreach循环枚举,如下所示:

  // 显示类型的方法名称
 static void ListMethods(Type t)
  {
      Console.WriteLine("***** Methods *****");
      MethodInfo[] mi = t.GetMethods();
      foreach (MethodInfo m in mi) {
          Console.WriteLine("-> {0}", m.Name);
      }
      Console.WriteLine();
  }

这里,只是使用MethodInfo.Name属性输出方法的名称,此外MethodInfo有许多其他成员可以决定方法是否静态的、虚拟的、泛型的或抽象的,不仅如此,使用MethodInfo类型还能够获取方法的返回值和参数集。
反射字段和属性
还有一个与ListMethods()的实现非常相似就是ListFields(),不过注意不同的是:ListFields()调用了Type.GetFields()并且它的返回值是FieldInfo数组。为了说明一下,
就使用LINQ查询只输出了每个字段的名称。

static void ListFields(Type t)
        {
            Console.WriteLine("***** Fields *****");
            var fieldNames = from f in t.GetFields() select f.Name;
            foreach (var name in fieldNames) {
                Console.WriteLine("->{0}", name);
            }
            Console.WriteLine();
        }
        // 显示类型的属性名称
        static void ListProps(Type t)
        {
            Console.WriteLine("***** Properties ******");
            var propNames = from p in t.GetProperties() select p.Name;
            foreach (var name in propNames) {
                Console.WriteLine("-> {0}", name);
            }
            Console.WriteLine();
        }

反射实现的接口
建立一个名为ListInterfaces()的方法,它将输出传入类型支持所有的接口名称。注意:对GetInterfaces()的调用返回一个System.Type类型的数组。

 // 显示实现的接口
 static void ListInterfaces(Type t)
 {
     Console.WriteLine("***** Interfaces ******");
     var ifaces = from i in t.GetInterfaces() select i;
     foreach (Type i in ifaces)
     {
         Console.WriteLine("->{0}", i.Name);
     }
 }

说明:System.Type中的大多数get方法(GetMethods()、GetInterfaces()等)都包含指定BindingFlags枚举值得重载,可以对搜索的内容进行较大的的控制。
实现Main()方法

static void Main(string[] args)
        {
            Console.WriteLine("***** Welcome to MyTypeViewer *****");
            string typeName = "";

            do
            {
                Console.WriteLine("\nEnter a type name to evaluate");
                Console.WriteLine("or enter Q to quit: ");

                // 得到类型的名称
                typeName = Console.ReadLine();

                // 询问用户是否想退出
                if (typeName.ToUpper() == "Q")
                {
                    break;
                }

                // 测试显示类型
                try
                {
                    Type t = Type.GetType(typeName);
                    Console.WriteLine("");
                    ListFields(t);
                    ListProps(t);
                    ListMethods(t);
                    ListInterfaces(t);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Sorry,Can't find type");
                }
            } while (true);
        }

启动项目运行,控制台输出的结果如下:
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值