C#接口(interface)與類(class)的實例互相轉(zhuǎn)換深度解析
我們通常的做法是:類實現(xiàn)接口-》對該類進行實例化-》把類的實例轉(zhuǎn)換成實現(xiàn)的接口-》通過接口進行操作,大體上是這么一個過程,你可以放心使用接口已知的方法和屬性,而不用去擔心調(diào)用出錯, 而且你不用去管方法的代碼是怎樣實現(xiàn)的。但是,我們可以思考一個問題:接口相當于一個框架,是沒有實體內(nèi)容的(具體的代碼),一個類的實例轉(zhuǎn)換成接口實例后,是否可以反向轉(zhuǎn)換呢?如果不經(jīng)過腦袋思考的話,答案是否定的。但是,事實是怎樣的呢?下面看一下分析的結(jié)果:
下面一段代碼,實現(xiàn)把一個自定義的控件動態(tài)的增加到一個窗體中。
//ControlLibrary.UserControl1控件實現(xiàn)了ControlLibrary.IValue接口,里邊只有SetValue方法
Assembly assembly=Assembly.LoadFrom ("ControlLibrary.dll");
Type t = assembly.GetType("ControlLibrary.UserControl1");
MethodInfo me = t.GetMethod("InitControl");
Object obj = Activator.CreateInstance(t);
ControlLibrary.UserControl1 ctrl = (ControlLibrary.UserControl1)me.Invoke(obj, new object[] { 10 });
_value=(ControlLibrary.IValue)ctrl; //_value是接口變量
ControlLibrary.UserControl1 c = (ControlLibrary.UserControl1)_value;
UserControl c1 = (UserControl)_value;
this.Controls.Add(c);
藍色字體是主要部分,按理說這段代碼 ControlLibrary.UserControl1 c = (ControlLibrary.UserControl1)_value(把接口轉(zhuǎn)換成自定義控件) 是不可以實現(xiàn)的,也違背了我們寫程序的基本規(guī)則。
但是,經(jīng)過分析上述做法是可能實現(xiàn)的,并且可以把接口轉(zhuǎn)換成自定義控件的實例增加到窗體中。請看一個反編譯后的代碼:
圖1:在創(chuàng)建這個控件的時候會返會一個實例,同樣的會有一個實例的地址。ebp-4ch是一個指針地址。
![]()
圖2:當把創(chuàng)建的實例轉(zhuǎn)換成接口后,會分配一個新的指針地址,原來的ebp-4ch變成了ebp-3ch

圖3:再把接口實例轉(zhuǎn)換成自定義的控件實例,指針地址依然是ebp-3ch。這就證明了,接口實例和轉(zhuǎn)換后控件實例共用一個地址。

圖4:把轉(zhuǎn)換后的控件實例增加到窗體中是可以的。這個地址依然是ebp-3ch。
![]()
c1 實例的地址也是ebp-3ch,上述分析說明了類實例轉(zhuǎn)換成接口實例后,可以對接口實例進行反向轉(zhuǎn)換。
來源:【百木破解】C#接口【interface】與類【class】的實例互相轉(zhuǎn)換深度解析
http://www.bmpj.net/forum-viewthread-tid-195-fromuid-15.html
QQ群組發(fā)布群號。

浙公網(wǎng)安備 33010602011771號