反射的心得与不得

Q:反射是个神马浮云?

A:反射是个装B的“类拆卸机”(拆卸机应该是反射的亲民称呼。注意,它拆的是类不是对象。类和对象,就好比是图纸和根据图纸制造出来的实物。),它把一个类拆得昏天暗地,并把拆卸下来的成员封装为一个叫做System.RuntimeType的类中,提供各种方法让人使用拆下的成员。

Q:装B的拆卸机拆卸一个类后怎么归类原来的成员?

A:是这样的,牛逼机提供一个枚举来检索它归成什么类,叫做 MemberTypes,包含:

  成员名称 说明
  Constructor

构造函数,表示 ConstructorInfo 成员。 0x01 的十六进制值。缩写为.ctor

  Event 事件,表示 EventInfo 成员。 0x02 的十六进制值。
  Field 字段,表示 FieldInfo 成员。 0x04 的十六进制值。
  Method              方法,表示 MethodInfo 成员。 0x08 的十六进制值。
  Property   属性,表示 PropertyInfo 成员。 0x10 的十六进制值。
  TypeInfo                   类型,表示 TypeInfo 成员。 0x20 的十六进制值。
  Custom 自定义成员类型。 0x40 的十六进制值。
  NestedType 嵌套类型,可扩展 MemberInfo
  All

指定所有成员类型

Q:一个类被拆卸后,可不可以用"."来引用?

A:不行,完全不行,已经被拆不存在原来的结构了,不要幻想用"."来引用,老老实实用拆卸机的各种方法。

Q:举个例子,如何通过拆卸机(反射)操作嵌套类。

A:行

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Type type = typeof(abc);

            Type[] mb = type.GetNestedTypes(BindingFlags.Public | BindingFlags.Instance);

            foreach (var ss in mb)
            {
                Console.WriteLine(ss.Name + "  ----->  " + ss.ReflectedType);

                FieldInfo info = ss.GetField("abc1str");
                object obj = Activator.CreateInstance(ss);//实例化嵌套类,如果abc1str是静态成员,则无需实例化即可访问
                Console.WriteLine(info.GetValue(obj));//从实例中取得"abc1str"字段的值,如果abc1str是静态成员,则可可以info.GetValue(ss)
            }



            Console.ReadKey(true);
        }
    }

    class abc
    {
        public string s1 = "abc1.s1";
        private string v1;

        public string V1
        {
            get { return v1;}
            set { v1 = value; }
        }
        public void abc1_pr(string pr)
        {
            Console.WriteLine(pr);
        }
        public class abc1
        {
            public string abc1str = "abc1.text";
            public static string aaa = "aaa";
        }
    }

}


(待续)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值