c#在派生类上隐藏方法并使用Attributes

时间:2016-06-05 06:37:13

标签: c# reflection base derived custom-attribute

我有如下对象模型。

a,b = 1,2
a = 1 
b = 2 

当用户右键单击时,应用程序将显示PopupMenu(GenerateGroupPopupMenuItems方法)。菜单项将基于已声明CandidateApiForMenuItem的方法。但是,有派生类(MainGroup),其中不应显示某些方法(f.e:Remove)。我做了什么,在MainGroup内部将Remove方法声明为private。但是,它会再次显示。

请问我能告诉我这里的工作情况吗?

感谢。

1 个答案:

答案 0 :(得分:3)

首先,不带参数的this.GetType().GetMethods()仅返回公共实例(即非静态)方法。因此,此次通话不会返回MainGroup.Remove

如果你使MainGroup.Remove公开,this.GetType().GetMethods()将返回两种方法 - 基类和派生类。我想,不是你想要的。

如果您使FormDataElementBase.Remove虚拟和MainGroup.Remove覆盖,GetMethods将只返回一个Remove方法(DeclaringType==typeof(MainGroup)) - 这样会更好。

最后,我建议再引入一个属性,比如CandidateApiIgnore。如果我们使用此属性标记重写方法并使用以下GenerateGroupPopupMenuItems方法进行修改,那么这些内容应该可以正常工作:

[AttributeUsage(AttributeTargets.Method)]
public sealed class CandidateApiIgnore : Attribute
{
    public CandidateApiIgnore() { }
}

public class FormDataElementBase
{
///...
    [CandidateApiForMenuItem("Remove")]
    public virtual void Remove()
    {
        ///...
    }

    public void GenerateGroupPopupMenuItems()
    {
        foreach (MethodInfo methodInfo in this.GetType().GetMethods())
        {
            if (methodInfo.GetCustomAttribute(typeof(CandidateApiForMenuItem)) != null &&
                methodInfo.GetCustomAttribute(typeof(CandidateApiIgnore)) == null)
            {
                // If a method is overridden and marked with
                // CandidateApiIgnore attribute in a derived
                // class, it won't be processed here.
            };
        };
}

public class MainGroup : FormDataElementBase
{
    [CandidateApiIgnore]
    public override void Remove()
    {
        throw new NotSupportedException();
    }
}