RSCG – IDisposableGenerator
| name | IDisposableGenerator |
| nuget | https://www.nuget.org/packages/IDisposableGenerator/ |
| link | https://github.com/Elskom/IDisposableGenerator |
| author | Els_kom Official Organization |
Generating disposable
This is how you can use IDisposableGenerator .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="IDisposableGenerator" Version="1.1.1" OutputItemType="Analyzer" >
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
</Project>
The code that you will use is
using IDisposableGeneratorDemo;
//https://github.com/benutomo-dev/RoslynComponents
using (var db = new DALDB())
{
Console.WriteLine("before releasing");
}
Console.WriteLine("after releasing");
namespace IDisposableGeneratorDemo;
[IDisposableGenerator.GenerateDispose(false)]
partial class DALDB :IDisposable
{
[IDisposableGenerator.DisposeField(true)]
private ConnectionDB cn;
[IDisposableGenerator.DisposeField(true)]
private ConnectionDB cn1;
public DALDB()
{
cn = new ConnectionDB();
cn1=new ConnectionDB();
}
}
namespace IDisposableGeneratorDemo;
class ConnectionDB : IDisposable
{
public void Dispose()
{
Console.WriteLine("disposing connectiondb");
}
}
The code that is generated is
// <autogenerated/>
namespace IDisposableGeneratorDemo;
internal partial class DALDB : IDisposable
{
private bool isDisposed;
internal bool IsOwned { get; set; }
/// <summary>
/// Cleans up the resources used by <see cref="DALDB"/>.
/// </summary>
public void Dispose() => this.Dispose(true);
private void Dispose(bool disposing)
{
if (!this.isDisposed && disposing)
{
if (this.IsOwned)
{
this.cn?.Dispose();
this.cn = null;
this.cn1?.Dispose();
this.cn1 = null;
}
this.isDisposed = true;
}
}
}
// <autogenerated/>
#pragma warning disable SA1636,8618
namespace IDisposableGenerator
{
using System;
// used only by a source generator to generate Dispose() and Dispose(bool).
[AttributeUsage(AttributeTargets.Method,Inherited = false,AllowMultiple = false)]
internal class CallOnDisposeAttribute : Attribute
{
public CallOnDisposeAttribute()
{
}
}
// used only by a source generator to generate Dispose() and Dispose(bool).
[AttributeUsage(AttributeTargets.Event | AttributeTargets.Field | AttributeTargets.Property,Inherited = false,AllowMultiple = false)]
internal class DisposeFieldAttribute : Attribute
{
public DisposeFieldAttribute(bool owner)
{
}
}
// used only by a source generator to generate Dispose() and Dispose(bool).
[AttributeUsage(AttributeTargets.Class,Inherited = false,AllowMultiple = false)]
internal class GenerateDisposeAttribute : Attribute
{
public GenerateDisposeAttribute(bool stream)
{
}
}
// used only by a source generator to generate Dispose() and Dispose(bool).
[AttributeUsage(AttributeTargets.Event | AttributeTargets.Field | AttributeTargets.Property,Inherited = false,AllowMultiple = false)]
internal class NullOnDisposeAttribute : Attribute
{
public NullOnDisposeAttribute()
{
}
}
}
#pragma warning restore SA1636,8618
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/IDisposableGenerator
Leave a Reply