Closed dboydboy closed 2 years ago
Attribute
的继承很容易导致混乱,不同于方法,你override
一下就知道哪些方法可以重写,Attribute
如果支持了继承,那么你在编写代码的时候如果想知道你的这个方法应用了哪些Attribute
,你就必须手动一层一层的往上找,想要覆盖那个也要一层一层的找,如果父类什么时候去掉了某个Attribute
,子类并不会编译报错不会收到任何提示。总而言之,支持Attribute
继承/重写等操作都不是一个好的方式,该功能不予支持。
另外代码和输出结果最好以代码和文字直接插入,而不要使用截图
Attribute
的继承很容易导致混乱,不同于方法,你override
一下就知道哪些方法可以重写,Attribute
如果支持了继承,那么你在编写代码的时候如果想知道你的这个方法应用了哪些Attribute
,你就必须手动一层一层的往上找,想要覆盖那个也要一层一层的找,如果父类什么时候去掉了某个Attribute
,子类并不会编译报错不会收到任何提示。总而言之,支持Attribute
继承/重写等操作都不是一个好的方式,该功能不予支持。另外代码和输出结果最好以代码和文字直接插入,而不要使用截图
静态织入下确实不太好实现... 能否实现子类中的切面执行,祖先的切面都不执行?类似优先级...
从Rougamo
本身来考虑是做不到的,比如下面有A
、B
两个类,按你的想法Main
方法中调用a.Print
的时候[Test2("Parent")]
生效,调用b.Print
的时候是[Test2("Sub")]
生效而[Test2("Parent")]
是不生效的。在静态织入里,只有选择织入和不织入,而不能根据运行时的调用来决定
class A
{
[Test2("Parent")]
public virtual void Print(string message)
{
Console.WriteLine(message);
}
}
class B : A
{
[Test2("Sub")]
public override void Print(string message)
{
message = $"[{DateTime.Now}] {message}";
base.Print(message);
}
}
static void Main()
{
var a = new A();
var b = new B();
var msg = "message";
a.Print(msg);
b.Print(msg);
}
试了一下继承下的切面动作:
觉得结果和预想的不太一样... 是否可以: