将扩展方法限制为基类

AJ *_*son 2 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Sco*_*ski 6

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

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