using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
public static void Main(string[] args)
private readonly UnitOfWorkManager _unitOfWorkManager = new UnitOfWorkManager();
Console.WriteLine($"Before method called Current is {_unitOfWorkManager.Current.GetHashCode()}");
GetAllTermUserEmailAddressesHedefBelirlemeDirektorVeUstu();
Console.WriteLine($"After method called Current is {_unitOfWorkManager.Current.GetHashCode()}");
[DisableFilter(DataFilter.MustHaveTermId)]
[DisableFilter(DataFilter.SomeFilter)]
private Task<List<TermUserEmailInformationDto>> GetAllTermUserEmailAddressesHedefBelirlemeDirektorVeUstu()
Task<List<TermUserEmailInformationDto>> result = null;
_unitOfWorkManager.DoWithFilters(() =>
Console.WriteLine("Performing GetAllTermUserEmailAddressesHedefBelirlemeDirektorVeUstu");
internal class UnitOfWorkManager : IDisposable
public UnitOfWorkManager Current { get; private set; }
public UnitOfWorkManager()
public UnitOfWorkManager DisableFilter(DataFilter dataFilter)
var manger = new UnitOfWorkManager();
Console.WriteLine($"Created UnitOfWorkManager {manger.GetHashCode()} with {dataFilter} disabled");
public void DoWithFilters(Action action)
var managers = new List<UnitOfWorkManager>();
foreach (var attribute in
new StackTrace().GetFrame(1).GetMethod().GetCustomAttributes(false).OfType<DisableFilterAttribute>())
managers.Add(Current = Current.DisableFilter(attribute.DataFilter));
foreach (var manager in managers)
public void Dispose() { Console.WriteLine($"Disposed UnitOfWorkManager {GetHashCode()}"); }
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
internal class DisableFilterAttribute : Attribute
public DataFilter DataFilter { get; }
public DisableFilterAttribute(DataFilter dataFilter) => DataFilter = dataFilter;
class TermUserEmailInformationDto { }