我有如下对象模型。
a,b = 1,2
a = 1
b = 2
当用户右键单击时,应用程序将显示PopupMenu(GenerateGroupPopupMenuItems方法)。菜单项将基于已声明CandidateApiForMenuItem的方法。但是,有派生类(MainGroup),其中不应显示某些方法(f.e:Remove)。我做了什么,在MainGroup内部将Remove方法声明为private。但是,它会再次显示。
请问我能告诉我这里的工作情况吗?
感谢。
答案 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();
}
}