这是我刚才遇到的一个有趣的问题。使用扩展方法可以做我想做的事,但似乎不可能对类本身的成员做任何事情。是否可以将泛型参数约束为当前对象的子类型?
随着扩展方法,可以写出具有看起来像这样一个签名的方法:
public static void DoStuff<T>(this T arg1, T arg2)
这个强制执行,这两种观点是任何类型的照顾你调用它的。与代表一起使用时,这变得更有用。
public static void DoStuff<T>(this T arg1, Action<T> arg2)
但是我不能让这与成员的工作。有没有这样的限制,因为这:
public void DoStuff<T>(T arg1) where T : typeof(this)
如果没有工作,那么你可以在你的基类中定义的方法是这样的(我用流,因为他们是一个内置的层次结构.NET):
class Stream
{
public void DoStuff<T>(T stream) where T : this
{
}
}
,然后在子类中,将不可能这样称呼它:
ByteStream bs = new ByteStream()
bs.DoStuff(new Stream()) // Error! DoStuff() should be inferred as DoStuff<ByteStream>()
是否有这样做的方法吗?我相信从参数自动推断类型,扩展方法是语法糖。这可能就是为什么它有效。因为扩展方法被静态调用替换,然后允许推断类型。
我问,因为我试图将一个扩展方法移动到一个公共的基类,并不能得到它没有添加类型信息编译。
澄清。这不是仅仅增加where T : MyType
,因为如果我创建一个名为MySubType
类型,从MyType
继承我将能够调用DoStuff
上MySubType
一个实例,并传递一个MyType
作为参数的情况下。这也意味着,在需要Action<T>
的情况下,我将无法先调用MySubType
的方法。
我想说,你实际上想限制参数派生类型应该让你考虑执行。这是一个打破Liskov替代原则 –