gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:48:27 26 4
gpt4 key购买 nike

我有如下示例对象模型。

[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) 不应显示某些方法(例如:Remove)。我所做的是,在 MainGroup 内部将 Remove 方法声明为私有(private)。但是,它再次显示。

你能告诉我我在这里做什么吗?

谢谢。

最佳答案

首先,不带参数的 this.GetType().GetMethods() 仅返回公共(public)实例(即非静态)方法。因此,此调用不会返回 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();
}
}

关于c# 在派生类上隐藏方法并使用属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37639172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com