RSCG – IDisposableGenerator
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