Мне нравится ответ Джона, но есть другой подход, похожий на подход Дэниела.Если у вас много методов расширения, вы можете определить «пространство имен».Это работает лучше всего, если у вас есть стабильный интерфейс для работы (т. Е. Если вы знали, что IThirdParty
не изменится).Однако в вашем случае вам потребуется класс-оболочка.
Я сделал это, чтобы добавить методы для обработки строк как путей к файлам.Я определил тип FileSystemPath
, который переносит string
и предоставляет свойства и методы, такие как IsAbsolute
и ChangeExtension
.
. При определении «пространства имен расширения» необходимо указать способ вводаэто и способ его оставить, как таковой:
// Enter my special namespace
public static MyThirdParty AsMyThirdParty(this ThirdParty source) { ... }
// Leave my special namespace
public static ThirdParty AsThirdParty(this MyThirdParty source) { ... }
Метод «выхода» из «пространства имен» может работать лучше как метод экземпляра, а не как метод расширения.Мой FileSystemPath
просто имеет неявное преобразование в string
, но это работает не во всех случаях.
Если вы хотите, чтобы MyThirdParty
имел все определенные в настоящее время члены ThirdParty
, а такжеметоды расширения (но не определяемые в будущем членами ThirdParty
), тогда вам придется перенаправлять реализации элементов в обернутый объект ThirdParty
.Это может быть утомительно, но такие инструменты, как ReSharper, могут делать это полуавтоматически.
Последнее замечание: префикс «As» при входе / выходе из пространства имен является своего рода невысказанным руководством.LINQ использует эту систему (например, AsEnumerable
, AsQueryable
, AsParallel
покидают текущее «пространство имен» и вводят другое).
Я написал пост в блоге в начале этого годао том, что я называю «типы на основе расширений».Есть больше подводных камней, чем просто невозможность переопределить методы экземпляра.Тем не менее, это очень интересная концепция.