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()」について考えてみましょう。Stringにも存在します。

于 2012-12-18T17:22:59.733 に答える