inversionhourglass / Rougamo

Compile-time AOP component. Works with any method, whether it is async or sync, instance or static. Uses an aspectj-like pattern to match methods.
MIT License
393 stars 47 forks source link

新版本 MoAttribute 继承之后使用造成入侵 #55

Closed 2881099 closed 9 months ago

2881099 commented 9 months ago
public abstract class MoAttribute : Attribute, IMo
{
    public virtual AccessFlags Flags { get; set; }

    public virtual string? Pattern { get; set; }

    public virtual Feature Features { get; set; }

    public virtual double Order { get; set; }
...
}

在最终使用的时候,优先展示了 MoAttribute 的内部属性。

建议设置成 protected,使用者继承后自已选择是否开放,例如:

public class TransactionalAttribute : Rougamo.MoAttribute
{
    protected override AccessFlags Flags { get => base.Flags; set => base.Flags = value; }
}
inversionhourglass commented 9 months ago

你是说下面使用TransactionalAttribute时的属性提示吗,像下面这样的。 image

这个确实使用体验上会受到影响,肉夹馍的部分功能在使用时并不需要,不过设置为protected无法重写直接改变访问级别,需要使用其他属性进行暴露,这会影响到肉夹馍在编译时的属性取值,肉夹馍是通过属性名称来取值的。

我有另一个解决方案,可以使用new关键字覆盖MoAttribute的属性,然后修改setter的可访问性,getter还是需要保持public的:

public class TransactionalAttribute : Rougamo.MoAttribute
{
    public new AccessFlags Flags { get => base.Flags; private set => base.Flags = value; }
}

可以尝试下这种方式是否能满足需求

inversionhourglass commented 9 months ago

抱歉,之前应该是我测试的方式不对,通过new的这种方式无法屏蔽已经开放的属性,同样还是存在提示,只是在使用的时候会提示可访问性不足

inversionhourglass commented 9 months ago

现在默认将MoAttribute的所有属性的setter都改为private的了,如果需要公开某个属性的setter,同样使用new关键字进行覆盖

public class TestAttribute : MoAttribute
{
    // 通过new关键字覆盖了MoAttribute的Order属性,同时将setter设置为public
    // virtual关键字是可选的,如果你确定没有类型会继承自TestAttribute并重写Order属性,那么可以去掉virtual
    // 这里为Order设置了一个默认值,当然也可以不设置
    public new virtual double Order { get; set; } = 10;
}

该修改将在2.2版本中上线,近日将发布2.2正式版,目前已经可以通过preview版本进行测试了。