gpt4 book ai didi

c# - .NET 核心 : attributes that execute before and after method

转载 作者:太空狗 更新时间:2023-10-30 00:37:42 26 4
gpt4 key购买 nike

在 Java 中,可以使用 AspectJ 在执行方法前后添加行为,使用 method annotations .由于 C# Attributes 看起来非常相似,我想知道是否有可能实现类似的行为。我查看了几个教程和其他资源(123),但没有一个对我有帮助。

我想也许我可以通过将代码插入属性构造函数并使其成为一次性的来模仿这种行为,就像这样:

[AttributeUsage(AttributeTargets.Method)]
public class MyWritingAttribute : Attribute, IDisposable
{
public MyWritingAttribute()
{
Console.WriteLine("Attribute created");
}

public void Dispose()
{
Console.WriteLine("Attribute disposed");
}
}

但是,当使用这样的属性时,只有 Hello world! 显示在控制台中:

class Program
{
static void Main(string[] args)
{
SayHelloWorld();
Console.ReadLine();
}

[MyWriting]
private static void SayHelloWorld()
{
Console.WriteLine("Hello World!");
}
}

我在想,也许控制台在属性中是不可访问的,但即使用 throw new Exception() 表达式替换它,也没有抛出异常。 EF 中的 StringLengthAttribute 怎么可能工作,但我的属性甚至没有实例化?以及如何使属性在装饰方法之前和之后运行?

最佳答案

您需要一些能够适当处理您的属性的框架。仅仅因为该属性存在并不意味着它会有任何影响。

我写了一些简单的引擎来做到这一点。它将确定该属性是否存在于传递的 action 中,如果存在,则获取反射的方法以执行它们。

class Engine
{
public void Execute(Action action)
{
var attr = action.Method.GetCustomAttributes(typeof(MyAttribute), true).First() as MyAttribute;
var method1 = action.Target.GetType().GetMethod(attr.PreAction);
var method2 = action.Target.GetType().GetMethod(attr.PostAction);

// now first invoke the pre-action method
method1.Invoke(null, null);
// the actual action
action();
// the post-action
method2.Invoke(null, null);
}
}
public class MyAttribute : Attribute
{
public string PreAction;
public string PostAction;
}

当然你需要一些空值,例如如果方法不存在或不是静态的。

现在你必须用属性装饰你的 Action :

class MyClass
{
[MyAttribute(PreAction = "Handler1", PostAction = "Handler2")]
public void DoSomething()
{

}

public static void Handler1()
{
Console.WriteLine("Pre");
}
public static void Handler2()
{
Console.WriteLine("Post");
}
}

最后,您可以在我们的引擎中执行该方法:

var engine = new Engine();
var m = new MyClass();
engine.Execute(m.DoSomething);

关于c# - .NET 核心 : attributes that execute before and after method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46000757/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com