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";
}
}
}
(待续)