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