MBW.Generators.NonTryMethods 0.3.0

dotnet add package MBW.Generators.NonTryMethods --version 0.3.0
                    
NuGet\Install-Package MBW.Generators.NonTryMethods -Version 0.3.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="MBW.Generators.NonTryMethods" Version="0.3.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="MBW.Generators.NonTryMethods" Version="0.3.0" />
                    
Directory.Packages.props
<PackageReference Include="MBW.Generators.NonTryMethods" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add MBW.Generators.NonTryMethods --version 0.3.0
                    
#r "nuget: MBW.Generators.NonTryMethods, 0.3.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package MBW.Generators.NonTryMethods@0.3.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=MBW.Generators.NonTryMethods&version=0.3.0
                    
Install as a Cake Addin
#tool nuget:?package=MBW.Generators.NonTryMethods&version=0.3.0
                    
Install as a Cake Tool

MBW.Generators.NonTryMethods

About

Creates non-try wrappers for methods that follow the TryX pattern. The generator scans for matching methods and emits counterparts that return the out value or throw when the original method fails. This helps turn low level APIs that expose bool Try... into friendlier ones.

Picture a repository with a TryFind method that returns a bool and an out value. Consumers often just want the value and are fine with an exception when it is missing.

Quick Start

  • Install the MBW.Generators.NonTryMethods package.
  • Add [GenerateNonTryMethod] (and optionally [GenerateNonTryOptions]) at the assembly or type level.
  • By default, methods matching the regex ^[Tt]ry(.*) with a bool return and an out parameter are wrapped, as are async methods returning Task<(bool, T)> or ValueTask<(bool, T)>. Generated methods return the success value or throw InvalidOperationException. Generated members are emitted into partial types; set MethodsGenerationStrategy.Extensions to produce extension methods instead.

The package includes both the attributes and the source generator.

Example

using MBW.Generators.NonTryMethods.Attributes;

[GenerateNonTryMethod(typeof(InvalidOperationException))]
[GenerateNonTryOptions(returnGenerationStrategy: ReturnGenerationStrategy.TrueMeansNotNull)]
public partial class Repository
{
    public bool TryFind(int id, out string? value)
    {
        value = id == 1 ? "one" : null;
        return value is not null;
    }
}

Generates

// <auto-generated/>
#nullable enable
using System;

partial class Repository
{
    public string Find(int id)
    {
        if (TryFind(id, out var value))
            return value;

        throw new InvalidOperationException();
    }
}

Features

  • Flexible targeting of try-pattern methods via attributes and regexes.
  • Customize the exception thrown when a method fails.
  • Supports synchronous and asynchronous wrappers.
  • Uses incremental generators for performance.
  • Emits diagnostics to guide correct usage, including invalid regex patterns, duplicate signatures, and collisions with existing members.
  • Generated methods include XML documentation that references the source method.
  • Generates partial members, extensions, and interface implementations with default bodies.
  • Preserves visibility, parameter names, modifiers (ref, in, out, params) and default values from the source methods.
  • Extension methods respect value-type receivers by adding ref or in where required.

Attributes

  • GenerateNonTryMethodAttribute – apply to an assembly, class, interface or struct. Selects which try methods are wrapped.
    • exceptionType – exception thrown when the wrapped method returns false (default InvalidOperationException).
    • methodNamePattern – regex used to identify methods to wrap (default ^[Tt]ry(.*)).
  • GenerateNonTryOptionsAttribute – apply to an assembly, class, interface or struct to control generation.
    • AsyncCandidateStrategy – include or exclude async try methods:
      • None – ignore async methods.
      • TupleBooleanAndValue – wrap methods returning Task<(bool, T)> or ValueTask<(bool, T)>.
    • ReturnGenerationStrategy – governs nullability of the generated method's return type:
      • Verbatim – copy the out parameter's nullability.
      • TrueMeansNotNull – successful calls are assumed to return non-null.
    • MethodsGenerationStrategy – where to place generated methods:
      • Auto – emit into partial types (default).
      • PartialType – emit into partial types (requires partial declaration).
      • Extensions – emit extension methods.

GenerateNonTryMethodAttribute may be used multiple times. GenerateNonTryOptionsAttribute is single-use. Neither attribute is inherited.

More information

This project is provided as-is without support. Additional examples are available in the tests.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETStandard 2.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.3.0 193 9/1/2025
0.2.2 549 10/12/2021
0.2.1 467 4/23/2021
0.2.0 519 4/23/2021