在網上尋找了不少的資料,可以說大同小異,概念性的東西網上一搜一堆,今天把C#反射方法的東西整理了一下,供大家使用,我保證我這裡是最全面的東西,當然也是基礎的東西,在學好了這一切的基礎上,大家可以學習C#反射方法的具體外掛程式等應用,老鳥就不用看了。首先我們建立一個類庫,將它產生為HelloWorld.dll:
1 usingSystem;
2 namespaceWebtest
3 …{
4 publicinterfaceinterface1
5 …{
6 intadd();
7 }
8 publicclassReflectTest:interface1
9 …{
10 publicStringWrite;
11 privateStringWritec;
12 publicStringWritea
13 …{
14 get
15 …{
16 returnWrite;
17 }
18 set
19 …{
20 Write=value;
21 }
22 }
23 privateStringWriteb
24 …{
25 get
26 …{
27 returnWritec;
28 }
29 set
30 …{
31 Writec=value;
32 }
33 }
34 publicReflectTest()
35 …{
36 this.Write="Write";
37 this.Writec="Writec";
38 }
39 publicReflectTest(stringstr1,stringstr2)
40 …{
41 this.Write=str1;
42 this.Writec=str2;
43 }
44 publicstringWriteString(strings,intb)
45 …{
46 return"歡迎您,"+s+"---"+b;;
47 }
48 publicstaticstringWriteName(strings)
49 …{
50 return"歡迎您光臨,"+s;
51 }
52 publicstringWriteNoPara()
53 …{
54 return"您使用的是無參數方法";
55 }
56 privatestringWritePrivate()
57 …{
58 return"私人類型的方法";
59 }
60 publicintadd()
61 …{
62 return5;
63 }
64 }
65 }
66 然後,建立再建立一個項目引入該HelloWorld.dll:
67 usingSystem;
68 usingSystem.Threading;
69 usingSystem.Reflection;
70 classTest
71 …{
72 delegatestringTestDelegate(stringvalue,intvalue1);
73 staticvoidMain()
74 …{
75 //AssemblyAssemblyt=Assembly.LoadFrom("HelloWorld.dll");與下面相同的效果
76 AssemblyAssemblyt=Assembly.Load("HelloWorld");
77 foreach(Typeaaaint.GetTypes())
78 …{
79 //Console.Write(aaa.Name);//顯示該dll下所有的類
80 }
81 Module[]modules=t.GetModules();
82 foreach(Modulemoduleinmodules)
83 …{
84 //Console.WriteLine("modulename:"+module.Name);//顯示模組的名字本例為"HelloWorld.dll"
85 }
86 Typea=typeof(Webtest.ReflectTest);//得到具體的類的類型,和下面一個效果
87 //Typea=t.GetType("Webtest.ReflectTest");//
88 //Console.Write(a.Name);
89 string[]bb=…{"aaaa","bbbbb"};
90 objectobj=Activator.CreateInstance(a,bb);//建立該類的執行個體,後面的bb為有參建構函式的參數
91 //objectobj=t.CreateInstance("Webtest.ReflectTest");//與上面方法相同
92 MethodInfo[]miArr=a.GetMethods();
93 foreach(MethodInfomi0inmiArr)
94 …{
95 //Console.Write(mi0.Name);//顯示所有的共有方法
96 }
97 MethodInfomi=a.GetMethod("WriteString");//顯示具體的方法
98 object[]aa=…{"使用的是帶有參數的非靜態方法",2};
99 strings=(string)mi.Invoke(obj,aa);//帶參數方法的調用
100 MethodInfomi1=a.GetMethod("WriteName");
101 String[]aa1=…{"使用的是靜態方法"};
102 strings1=(string)mi1.Invoke(null,aa1);//靜態方法的調用
103 MethodInfomi2=a.GetMethod("WriteNoPara");
104 strings2=(string)mi2.Invoke(obj,null);//不帶參數的方法調用
105 MethodInfomi3=a.GetMethod("WritePrivate",BindingFlags.Instance|BindingFlags.NonPublic);
106 strings3=(string)mi3.Invoke(obj,null);//私人類型方法調用
107 //Console.Write(s3);
108 PropertyInfo[]piArr=a.GetProperties
109 (BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public);
110 foreach(PropertyInfopiinpiArr)
111 …{
112 //Console.Write(pi.Name);//顯示所有的方法
113 }
114 PropertyInfopi1=a.GetProperty("Writea");
115 //pi1.SetValue(obj,"Writea",null);
116 //Console.Write(pi1.GetValue(obj,null));
117 PropertyInfopi2=a.GetProperty
118 ("Writeb",BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public);
119 pi2.SetValue(obj,"Writeb",null);
120 //Console.Write(pi2.GetValue(obj,null));
121 FieldInfofi1=a.GetField("Write");
122 //Console.Write(fi1.GetValue(obj));
123 ConstructorInfo[]ci1=a.GetConstructors();
124 foreach(ConstructorInfociinci1)
125 …{
126 //Console.Write(ci.ToString());//獲得建構函式的形式
127 }
128 ConstructorInfoasCI=a.GetConstructor(newType[]…{
129 typeof(string),typeof(string)});
130 //Console.Write(asCI.ToString());
131 Webtest.interface1obj1=(Webtest.interface1)t.CreateInstance
132 ("Webtest.ReflectTest");
133 Webtest.ReflectTestobj2=(Webtest.ReflectTest)t.CreateInstance("Webtest.ReflectTest");
134 //Console.Write(obj1.add());典型的原廠模式
135 foreach(Typettint.GetTypes())
136 …{
137 if(tt.GetInterface("interface1")!=null)
138 …{
139 Webtest.interface1obj3=(Webtest.interface1)Activator.CreateInstance(a);
140 //Console.Write(obj3.add());
141 }
142 }
143 TestDelegatemethod=(TestDelegate)Delegate.CreateDelegate
144 (typeof(TestDelegate),obj,"WriteString");
145 //動態建立委託的簡單例子
146 Console.Write(method("str1",2));
147 Console.Read();
148 }
149 }
在這裡我把我們常用的方法,屬性,等全部整理了出來,大家不要嫌棄亂,靜下心來,自己按照我的分隔一部分一部分的來,保證你對C#反射方法的學習,會事半功倍。當然有關於其方法我會繼續補充,想了這麼些就先寫下來吧。