可以将当前类的类型用作泛型类型参数的值吗?

时间:2015-09-16 08:27:48

标签: c# generics

可以使用C#完成这样的事情吗?

public abstract class BaseClass
{
    public abstract IInterface<T> CreateEditor() where T: the_actual_type_of_this_instance;
}

使用示例:

var instance = new DerivedClass();
var editor = instance.CreateEditor(); // IInterface<DerivedClass>

1 个答案:

答案 0 :(得分:3)

不,你不能这样做 - 部分是因为它在编译时没有意义。考虑对代码进行轻微更改:

BaseClass instance = new DerivedClass();
var editor = instance.CreateEditor();

编译器可以推断editor的类型是什么?它只知道BaseClass,因此必须返回IInterface<BaseClass>。根据{{​​1}}中的T是否有协变性,这可能对实际实施IInterface<T>或可能不是

的内容有效。

您可能希望改为使用基类:

IInterface<DerivedClass>

这有两个问题:

  • 当你走到一个以上的深度时,它不起作用;如果您需要public abstract class BaseClass<T> where T : BaseClass<T> { public abstract IInterface<T> CreateEditor(); } public class DerivedClass : BaseClass<DerivedClass> { ... } 的子类,那么您将遇到问题
  • 它不会阻止恶意滥用模式,例如DerivedClass

......但在很多情况下它非常实用。