У меня была похожая проблема.В моем случае я реализовал некоторую асинхронную функциональность в F # и хотел иметь по существу тот же API, но возвращающий Async<T>
для F #, Task<T>
для потребителей C # 5 и просто T
для людей, которые не хотятиметь дело с async.
В итоге я создал три подпространства имен (Async, Sync и FSharp) и определил один и тот же интерфейс во всех трех пространствах имен, различающихся только типом возвращаемого значения.
Затем в классе, содержащем фактическую реализацию, я реализовал все три интерфейса и создал набор статических методов фабрики, которые просто создают экземпляр класса и приводят его к соответствующему интерфейсу.
Потребители могут затем вызыватьSomeClass.CreateAsync()
или SomeClass.CreateSync()
или SomeClass.CreateFSharp()
, чтобы получить интерфейс, соответствующий их среде.Им не нужно явно открывать ни одно из трех подпространств имен.
Полагаю, я также мог бы сделать это с точки зрения методов расширения, по крайней мере, если бы я хотел только две реализации.F # может определять как методы расширения F # -стиля, так и C # -стиля, но потребитель C # игнорирует расширения F #, а потребитель F # игнорирует расширения C #.