【发布时间】:2016-06-05 06:37:13
【问题描述】:
我有如下示例对象模型。
[AttributeUsage(AttributeTargets.Method)]
public sealed class CandidateApiForMenuItem : Attribute
{
public CandidateApiForMenuItem(string caption)
{
this.Caption = caption;
}
public string Caption { get; set; }
}
public class FormDataElementBase
{
public FormDataElementBase()
{
}
[CandidateApiForMenuItem("Add PanelGroup")]
public void AddPanelGroup()
{
///...
}
[CandidateApiForMenuItem("Add BoxGroup")]
public void AddBoxGroup()
{
///...
}
[CandidateApiForMenuItem("Remove")]
public void Remove()
{
///...
}
public void GenerateGroupPopupMenuItems()
{
foreach (MethodInfo methodInfo in this.GetType().GetMethods())
{
if (methodInfo.GetCustomAttribute(typeof(CandidateApiForMenuItem)) != null)
{
// This is true both for FormDataElementBase and all derived
// but I want to hide Remove method inside MainGroup class
// However it is displayed again
};
};
}
}
public class BoxGroup : FormDataElementBase
{
}
public class PanelGroup : FormDataElementBase
{
}
public class MainGroup : FormDataElementBase
{
private void Remove()
{
}
}
当用户右键单击时,应用程序将显示 PopupMenu(GenerateGroupPopupMenuItems 方法)。菜单项将基于声明了 CandidateApiForMenuItem 的方法。但是,有些派生类 (MainGroup) 不应该显示某些方法 (f.e: Remove)。我所做的,在 MainGroup 内部将 Remove 方法声明为私有。但是,它会再次显示。
你能告诉我我在这里做什么吗?
谢谢。
【问题讨论】:
-
new public void Remove() => base.Remove();怎么样? -
这个条件也显示那个。 If(methodInfo.GetCustomAttribute(typeof(CandidateApiForMenuItem)) != null)...
-
您没有“更改”删除为私有,您添加了另一个。查看警告窗口。
-
@Tim 如果在您的 GenerateGroupPopupMenuItems 方法中,您过滤的不仅仅是属性的存在怎么办?你在属性中给了自己一个 Caption 属性;如果您检查该属性以获取表示删除的特殊字符串值(定义为常量)怎么办?这避免了使用虚拟方法。
标签: c# reflection base derived custom-attribute