首先,我会问你是否你需要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