将扩展方法限制为基类

时间:2012-12-18 17:15:02

标签: c# inheritance extension-methods

有没有办法阻止扩展方法出现在派生类型和基类型中,并且只将它们限制为基类型?

我的情况有点特殊,但长话短说,我有一个场景,可以安全地从基础实体转换为派生实体,也可以安全地从派生实体列表转换为基础实体列表,反之亦然。由于这些演员通常是不安全的,我提供扩展方法来进行演员表,以便使用我的库的开发人员不必记住哪些演员表是安全的,哪些不是。

ToDerivedEntity扩展方法是相对于BaseEntity实现的,虽然在DerivedEntity上调用ToDerivedEntity没有任何损害,但从可用性的角度来看,如果我可以阻止ToDerivedEntity出现在DerivedEntity上并且仅将其限制为BaseEntity。

public class BaseEntity
{
}

public class DerivedEntity : BaseEntity
{
}

static class ExtensionMethods
{
    // Should only show up on BaseEntity.
    public static ToDerivedEntity(this BaseEntity source)
    {
        return (DerivedEntity)source;
    }
}

1 个答案:

答案 0 :(得分:6)

没有。你不能这样做。扩展方法适用于任何派生类型的接收器。您可以做的最好的事情是动态地强制执行此类操作(基于对象的运行时类型)。即抛出异常。但在这种情况下,这是不合适的。您希望该方法可以在派生类型的对象上调用。

更重要的是,从API设计的角度来看,这不是您想要做的事情。考虑“ToString()”。它也存在于String。