c# - 方法的 C# 自定义属性,包括使用关键字
问题描述
我需要准备一个Attribute
可以作为using
声明的自定义。
所以,下面的方法
private async Task<List<TermUserEmailInformationDto>> GetAllTermUserEmailAddressesHedefBelirlemeDirektorVeUstu()
{
using (_unitOfWorkManager.Current.DisableFilter(GlobalConstants.DataFilters.MustHaveTermId))
{
// Code goes on...
}
}
应该是这样的:
[DisableFilter(GlobalConstants.DataFilters.MustHaveTermId)]
private async Task<List<TermUserEmailInformationDto>> GetAllTermUserEmailAddressesHedefBelirlemeDirektorVeUstu()
{
// Code goes on...
}
有没有办法做到这一点?
解决方案
我建议这样的属性:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
internal class DisableFilterAttribute : Attribute
{
public DataFilter DataFilter { get; }
public DisableFilterAttribute(DataFilter dataFilter) => DataFilter = dataFilter;
}
enum DataFilter
{
MustHaveTermId,
SomeFilter,
AnotherFilter
}
注意属性参数的限制。
根据问题中的代码UnitOfWorkManager
应该是这样的:
internal class UnitOfWorkManager : IDisposable
{
public UnitOfWorkManager Current { get; private set; }
public UnitOfWorkManager()
{
Current = this;
}
public UnitOfWorkManager DisableFilter(DataFilter dataFilter)
{
var manager = new UnitOfWorkManager();
Console.WriteLine($"Created UnitOfWorkManager {manger.GetHashCode()} with {dataFilter} disabled");
return manager;
}
public void Dispose() { Console.WriteLine($"Disposed UnitOfWorkManager {GetHashCode()}"); }
}
我建议UnitOfWorkManager
用这样的方法修改:
public void DoWithFilters(Action action)
{
var current = Current;
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));
action();
managers.Reverse();
foreach (var manager in managers)
manager.Dispose();
Current = current;
}
可以这样使用它:
[DisableFilter(DataFilter.MustHaveTermId)]
[DisableFilter(DataFilter.SomeFilter)]
private Task<List<TermUserEmailInformationDto>> GetAllTermUserEmailAddressesHedefBelirlemeDirektorVeUstu()
{
Task<List<TermUserEmailInformationDto>> result = null;
_unitOfWorkManager.DoWithFilters(() =>
{
Console.WriteLine("Performing GetAllTermUserEmailAddressesHedefBelirlemeDirektorVeUstu");
// Code goes on...
});
return result;
}
跑步
Console.WriteLine($"Before method called Current is {_unitOfWorkManager.Current.GetHashCode()}");
GetAllTermUserEmailAddressesHedefBelirlemeDirektorVeUstu();
Console.WriteLine($"After method called Current is {_unitOfWorkManager.Current.GetHashCode()}");
给出如下结果:
Before method called Current is 46104728
Created UnitOfWorkManager 21083178 with MustHaveTermId disabled
Created UnitOfWorkManager 30015890 with SomeFilter disabled
Performing GetAllTermUserEmailAddressesHedefBelirlemeDirektorVeUstu
Disposed UnitOfWorkManager 30015890
Disposed UnitOfWorkManager 21083178
After method called Current is 46104728
这是上面代码的链接
推荐阅读
- flutter - 在没有 Provider.of() 的情况下更改模型和 notifyListeners()
- nginx - 如何使用 nginx 服务器路由自定义 URL 路径?
- powershell - powershell:试图将 5 个多行文本框逐行内容数组转换为 2 个文件,foreach 不是正确的方法(示例如下)
- ruby-on-rails - nil:NilClass 的未定义方法“消息”
- javascript - HTML 元素是否具有 DOM 的“隐藏索引”?
- php - 将数据推送到现有数组组
- python - Python - 使用 lambda 在 DataFrame 列中应用 rsplit
- javascript - 如何在给定特定子键的情况下获取所有父键
- bash - 运行 bash 脚本,zsh 的结果与 bash 不同,即使脚本有 bash shebanged
- php - Wordpress 联系表格 7 图像而不是单选按钮