首先,我會問你是否你需要ref
- 它似乎不尋常;這意味着你打算重新分配方法內的變量? (與通過實例更改屬性不同)。
對於ref
,它必須是完全匹配;你可以使用:
Control tmp = c;
Callee(ref tmp);
c = (MyControl) tmp;
另外,考慮泛型:
private void Callee<T>(ref T c) where T : Control
{ ... }
然後你可以使用Callee(ref c)
,它會推斷T = MyControl
(更新再評論)
在通用的例子,我們宣稱Callee
作爲「T」的通用方法,其中T是至少 a Control
。這個「至少」確保我們仍然可以訪問方法內部的所有Control
成員(因爲任何Control
的子類仍然有這些成員)。
泛型有點像模板(但不完全)。在調用方法時,調用者可以指定T.因此,來電者可以使用Callee<Control>(...)
,這與調用您現有的Callee(ref Control c)
進行比較。或者他們可以使用Callee<MyControl>(...)
,這就像撥打Callee(ref MyControl c)
--在兩種情況下,T
都會在整個方法中被替換。
但是,C#編譯器足夠智能,通常您不需要告訴它尖括號中的位;它可以看到你通過了一個MyControl
,所以它會假設(除非你另有說明)它應該使用T = MyControl
--這被稱爲泛型類型推斷。這裏的要點是,它可以很容易地將ref
與數據的子類一起使用。
對象本身是不是通過引用傳遞的? – 2009-01-30 22:55:36