方法過濾器 使用 和註解屬性 實現 使用方式 1. 自定義方法過濾器 可分別定義方法 執行前過濾器 , 方法 執行結束過濾器 , 方法 異常過濾器 執行前過濾器繼承 抽象類, 實現 抽象方法, 參數 為運行時攔截方法的參數列表 /// /// 自定義執行前過濾器 /// public class C ...
方法過濾器
使用Emit
和註解屬性Attribute
實現
使用方式
1. 自定義方法過濾器
可分別定義方法執行前過濾器, 方法執行結束過濾器, 方法異常過濾器
執行前過濾器繼承
ExecutingFilterAttribute
抽象類, 實現Execute
抽象方法, 參數parameters
為運行時攔截方法的參數列表/// <summary> /// 自定義執行前過濾器 /// </summary> public class CustomExecutingFilterAttribute : ExecutingFilterAttribute { public string Name { get; set; } public override void Execute(MethodParameters[] parameters) { Console.WriteLine("====================================================================="); if (parameters != null) Console.WriteLine($"執行前過濾器:{nameof(CustomExecutingFilterAttribute)}, Data:{this.Name}, Param:{string.Join(", ", parameters?.Select(p => p.ToString()))}"); else Console.WriteLine($"執行前過濾器:{nameof(CustomExecutingFilterAttribute)}, Data:{this.Name}"); } }
執行後過濾器繼承
ExecutedFilterAttribute
抽象類, 實現Execute
抽象方法,其中泛型參數returned
為攔截方法返回值, 對於無返回值的方法(void),此參數預設為數字0
/// <summary> /// 自定義執行後過濾器 /// </summary> public class CustomExecutedFilterAttribute : ExecutedFilterAttribute { public override void Execute<TReturn>(MethodParameters[] parameters, TReturn returned) { if (parameters != null) Console.WriteLine($"執行後過濾器:{nameof(CustomExecutedFilterAttribute)},Param:{string.Join(", ", parameters?.Select(p => p.ToString()))}, Return:{returned}"); else Console.WriteLine($"執行後過濾器:{nameof(CustomExecutedFilterAttribute)},Return:{returned}"); Console.WriteLine("=====================================================================\r\n"); } }
異常過濾器繼承
ErrorFilterAttribute
抽象類, 實現Execute
抽象方法, 其中參數ex
為攔截方法拋出的未處理異常/// <summary> /// 自定義錯誤過濾器 /// </summary> public class CustomErrorFilterAttribute : ErrorFilterAttribute { public override void Execute(MethodParameters[] parameters, Exception ex) { Console.ForegroundColor = ConsoleColor.Red; if (parameters != null) Console.WriteLine($"異常過濾器:{nameof(CustomErrorFilterAttribute)}, Param:{string.Join(", ", parameters?.Select(p => p.ToString()))},Exception:{ex}"); else Console.WriteLine($"異常過濾器:{nameof(CustomErrorFilterAttribute)}, Exception:{ex}"); Console.ResetColor(); } }
2. 定義介面
public interface IRepository
{
void Add<T>(T entity);
void Remove<T>(T entity);
void Update<T>(T entity, Func<T, bool> predicate);
}
3. 定義介面實現類, 併在攔截方法上運用自定義過濾器
public class Repository : IRepository
{
private List<string> list = new List<string>();
//運用過濾器
[CustomExecutingFilter]
[CustomExecutedFilter]
[CustomErrorFilter]
public void Add<T>(T entity)
{
list.Add(entity.ToString());
Console.WriteLine($"Added: Count-{list.Count}");
}
//運用過濾器
[CustomExecutingFilter]
[CustomExecutedFilter]
[CustomErrorFilter]
public void Remove<T>(T entity)
{
list.Remove(entity.ToString());
Console.WriteLine($"Removed: Count-{list.Count}");
}
//運用過濾器
[CustomExecutingFilter]
[CustomExecutedFilter]
[CustomErrorFilter]
public void Update<T>(T entity, Func<T, bool> predicate)
{
var item = list.FirstOrDefault(p => predicate(entity));
if (item == null)
throw new Exception("列表中不存在更新的項");
list.Remove(item);
list.Add(entity.ToString());
}
}
4. 調用
//實例化介面實現類
var repo = new Repository();
//動態生成代理
var repoProxy = EmitGenerator<IRepository>.GenerateProxy(repo);
//使用代理調用方法
repoProxy.Add("Hello");
repoProxy.Add("World");
repoProxy.Remove("World");
repoProxy.Update("A,ning", p => p == "World"); //將會拋出列表中不存在項異常