Skip to content

Add factory methods and extension methods for wrapping System.IDisposable objects#97

Open
konard wants to merge 3 commits into
mainfrom
issue-23-7cdd2a3c
Open

Add factory methods and extension methods for wrapping System.IDisposable objects#97
konard wants to merge 3 commits into
mainfrom
issue-23-7cdd2a3c

Conversation

@konard

@konard konard commented Sep 14, 2025

Copy link
Copy Markdown
Member

Summary

This PR addresses issue #23 by adding factory methods and extension methods that enable easy wrapping of System.IDisposable objects in the Platform's disposable wrappers.

Changes Made

1. Factory Methods

  • Added Disposable.Create(System.IDisposable) static method
  • Added Disposable.Create(System.IDisposable) static method
  • Added Disposable<TPrimary, TAuxiliary>.Create((System.IDisposable, System.IDisposable)) static method

2. Extension Methods

  • Added AsDisposable() extension method to wrap System.IDisposable in Disposable
  • Added AsDisposableContainer() extension method to wrap System.IDisposable in Disposable<System.IDisposable>

3. Test Coverage

  • Added comprehensive unit tests covering all new factory and extension methods
  • All tests verify proper disposal behavior and object reference handling

Usage Examples

// Using factory methods
var fileStream = new FileStream("test.txt", FileMode.Create);
var wrapper1 = Disposable.Create(fileStream);
var wrapper2 = Disposable<System.IDisposable>.Create(fileStream);

// Using extension methods
var timer = new Timer();
var wrapper3 = timer.AsDisposable();
var wrapper4 = timer.AsDisposableContainer();

// Wrapping multiple disposables
var stream1 = new MemoryStream();
var stream2 = new MemoryStream();
var multiWrapper = Disposable<System.IDisposable, System.IDisposable>.Create((stream1, stream2));

Note on Implementation Approach

Initially attempted to use implicit operators, but C# doesn't allow user-defined conversions to or from interfaces (CS0552). The current implementation using factory methods and extension methods provides a clean, discoverable API while avoiding compiler limitations.

Fixes #23

Adding CLAUDE.md with task information for AI processing.
This file will be removed when the task is complete.

Issue: #23
@konard konard self-assigned this Sep 14, 2025
@konard konard changed the title [WIP] Think about implicit converters from other Disposables and IDisposable objects (to implement wrappers) Add factory methods and extension methods for wrapping System.IDisposable objects Sep 14, 2025
@konard
konard marked this pull request as ready for review September 14, 2025 07:36
konard and others added 2 commits September 14, 2025 10:37
…able objects

- Add Disposable.Create(IDisposable) static factory method
- Add Disposable<T>.Create(IDisposable) static factory method
- Add Disposable<TPrimary, TAuxiliary>.Create((IDisposable, IDisposable)) static factory method
- Add AsDisposable() extension method for wrapping IDisposable in Disposable
- Add AsDisposableContainer() extension method for wrapping IDisposable in Disposable<T>
- Add comprehensive unit tests for all new functionality

Fixes #23 - Think about implicit converters from other Disposables and IDisposable objects (to implement wrappers)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Think about implicit converters from other Disposables and IDisposable objects (to implement wrappers)

1 participant