Hyperbee.Expressions
1.1.5
See the version list below for details.
dotnet add package Hyperbee.Expressions --version 1.1.5
NuGet\Install-Package Hyperbee.Expressions -Version 1.1.5
<PackageReference Include="Hyperbee.Expressions" Version="1.1.5" />
<PackageVersion Include="Hyperbee.Expressions" Version="1.1.5" />
<PackageReference Include="Hyperbee.Expressions" />
paket add Hyperbee.Expressions --version 1.1.5
#r "nuget: Hyperbee.Expressions, 1.1.5"
#addin nuget:?package=Hyperbee.Expressions&version=1.1.5
#tool nuget:?package=Hyperbee.Expressions&version=1.1.5
Welcome to Hyperbee Expressions
Hyperbee.Expressions
is a library for creating c# expression trees that extend the capabilities of standard expression
trees to handle asynchronous workflows and other language constructs.
Features
Async Expressions
AwaitExpression
: An expression that represents an await operation.AsyncBlockExpression
: An expression that represents an asynchronous code block.
Yield Expressions
YieldExpression
: An expression that represents a yield return or break statement.EnumerableBlockExpression
: An expression that represents an enumerable code block.
Using Expression
UsingExpression
: An expression that automatically disposes IDisposable resources.
Looping Expressions
WhileExpression
: An expression that represents a while loop.ForExpression
: An expression that represents a for loop.ForEachExpression
: An expression that represents a foreach loop.
Other Expressions
StringFormatExpression
: An expression that creates a string using a supplied format string and parameters.ConfigurationExpression
: An expression that allows access to IConfiguration.InjectExpression
: An expression that allows for depency inject from a IServiceProvider.DebugExpression
: An expression that helps when debugging expression trees.
Supports Fast Expression Compiler (FEC) for improved performance.
Supports interpreted expression trees using
lambda.Compile(preferInterpretation: true)
.var lambda = Expression.Lambda<Func<int>>(Expression.Constant(1)); var interpetedLambda = lambda.Compile(preferInterpretation: true);
Examples
Asynchronous Expressions
The following example demonstrates how to create an asynchronous expression tree.
When the expression tree is compiled, the AsyncBlockExpression
will auto-generate a state machine that executes
AwaitExpressions
in the block asynchronously.
public class Example
{
public async Task ExampleAsync()
{
// Create an async block that calls async methods and assigns their results
var instance = Constant( this );
var result1 = Variable( typeof(int), "result1" );
var result2 = Variable( typeof(int), "result2" );
var asyncBlock = BlockAsync(
[result1, result2],
Assign( result1, Await(
Call( instance, nameof(FirstAsyncMethod), Type.EmptyTypes )
) ),
Assign( result2, Await(
Call( instance, nameof(SecondAsyncMethod), Type.EmptyTypes, result1 )
) )
);
// Compile and execute the async block
var lambda = Lambda<Func<Task<int>>>( asyncBlock );
var compiledLambda = lambda.Compile();
var resultValue2 = await compiledLambda();
Console.WriteLine( $"Second async method result: {resultValue2}" );
}
public static async Task<int> FirstAsyncMethod()
{
await Task.Delay( 1000 ); // Simulate async work
return 42; // Example result
}
public static async Task<int> SecondAsyncMethod( int value )
{
await Task.Delay( 1000 ); // Simulate async work
return value * 2; // Example result
}
}
Yield Expressions
The following example demonstrates how to create a yield expression tree.
When the expression tree is compiled, the EnumerableBlockExpression
will auto-generate a state machine that executes
YieldExpressions
in the block.
public class Example
{
public void ExampleYield()
{
// Create an enumerable block that yields values
var index = Variable( typeof(int), "index" );
var enumerableBlock = BlockEnumerable(
[index],
For( Assign( index, Constant( 0 ) ), LessThan( index, Constant( 10 ) ), PostIncrementAssign( index ),
Yield( index )
)
);
// Compile and execute the enumerable block
var lambda = Lambda<Func<IEnumerable<int>>>( enumerableBlock );
var compiledLambda = lambda.Compile();
var enumerable = compiledLambda();
foreach( var value in enumerable )
{
Console.WriteLine( $"Yielded value: {value}" );
}
}
}
Using Expression
The following example demonstrates how to create a Using expression.
public class Example
{
private class DisposableResource : IDisposable
{
public bool IsDisposed { get; private set; }
public void Dispose() => IsDisposed = true;
}
public void ExampleUsing()
{
var resource = new TestDisposableResource();
var disposableExpression = Expression.Constant( resource, typeof( TestDisposableResource ) );
var bodyExpression = Expression.Empty(); // Actual body isn't important
var usingExpression = ExpressionExtensions.Using(
disposableExpression,
bodyExpression
);
var compiledLambda = Expression.Lambda<Action>( reducedExpression ).Compile();
compiledLambda();
Console.WriteLine( $"Resource was disposed {resource.IsDisposed}." );
}
}
Credits
Special thanks to:
- Sergey Tepliakov - Dissecting the async methods in C#.
- Fast Expression Compiler for improved performance. ❤️
- Just The Docs for the documentation theme.
Contributing
We welcome contributions! Please see our Contributing Guide for more detai
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0 is compatible. 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 is compatible. 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. |
-
net8.0
- Hyperbee.Collections (>= 2.4.0)
- Microsoft.CodeAnalysis.CSharp (>= 4.13.0)
- Microsoft.Extensions.Configuration (>= 9.0.3)
- Microsoft.Extensions.Configuration.Binder (>= 9.0.3)
- Microsoft.Extensions.DependencyInjection (>= 9.0.3)
-
net9.0
- Hyperbee.Collections (>= 2.4.0)
- Microsoft.CodeAnalysis.CSharp (>= 4.13.0)
- Microsoft.Extensions.Configuration (>= 9.0.3)
- Microsoft.Extensions.Configuration.Binder (>= 9.0.3)
- Microsoft.Extensions.DependencyInjection (>= 9.0.3)
NuGet packages (3)
Showing the top 3 NuGet packages that depend on Hyperbee.Expressions:
Package | Downloads |
---|---|
Hyperbee.XS
XS: A Lightweight, Extensible Scripting Language for Expression Trees. |
|
Hyperbee.XS.Extensions
Expression Script [XS] language extensions. |
|
Hyperbee.Expressions.Lab
Sample Extentions for .NET Expression Trees. |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.2.0-develop.250417163546 | 145 | 4/17/2025 |
1.1.5 | 263 | 4/2/2025 |
1.1.5-develop.250402163927 | 118 | 4/2/2025 |
1.1.5-develop.250402142908 | 111 | 4/2/2025 |
1.1.5-develop.250402133114 | 109 | 4/2/2025 |
1.1.5-develop.250402131116 | 112 | 4/2/2025 |
1.1.5-develop.250401194515 | 116 | 4/1/2025 |
1.1.4 | 177 | 3/31/2025 |
1.1.4-develop.250331172856 | 130 | 3/31/2025 |
1.1.4-develop.250328154856 | 96 | 3/28/2025 |
1.1.3 | 188 | 3/19/2025 |
1.1.3-develop.250319162912 | 118 | 3/19/2025 |
1.1.3-develop.250317193155 | 115 | 3/17/2025 |
1.1.3-develop.250317174611 | 127 | 3/17/2025 |
1.1.3-develop.250313195935 | 119 | 3/13/2025 |
1.1.3-develop.250313192012 | 110 | 3/13/2025 |
1.1.2 | 592 | 1/28/2025 |
1.1.2-develop.250108191742 | 163 | 1/8/2025 |
1.1.1 | 244 | 1/6/2025 |
1.1.0 | 173 | 12/23/2024 |
1.1.0-develop.241220155532 | 58 | 12/20/2024 |
1.0.1 | 102 | 12/10/2024 |
1.0.0 | 117 | 12/5/2024 |
1.0.0-develop.241205135900 | 59 | 12/5/2024 |