2

有没有办法防止扩展方法同时出现在派生类型和基类型中,并将它们限制在基类型中?

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

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;
    }
}
4

1 回答 1

6

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

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

于 2012-12-18T17:22:59.733 回答