C# 如何在不隐藏类基变量的情况下更改访问修饰符?
我正在尝试稍微扩展Process类,以添加Process.Exit委托的访问控制,并将其限制为一个。到目前为止,我有一个结果:C# 如何在不隐藏类基变量的情况下更改访问修饰符?,c#,casting,process,C#,Casting,Process,我正在尝试稍微扩展Process类,以添加Process.Exit委托的访问控制,并将其限制为一个。到目前为止,我有一个结果: public class ProcessWithData : Process { public EventHandler CurrentEventHandler { get; private set; } public new bool EnableRaisingEvents = true; private new EventHandler Ex
public class ProcessWithData : Process
{
public EventHandler CurrentEventHandler { get; private set; }
public new bool EnableRaisingEvents = true;
private new EventHandler Exited;
public void SetHandler(EventHandler eventHandler)
{
if (CurrentEventHandler != null) Exited -= CurrentEventHandler;
CurrentEventHandler = eventHandler;
Exited += CurrentEventHandler;
}
}
但是,
private new EventHandler Exited;
覆盖作为基础的流程类的现有EventHandler。所以
var proc = Process.Start("foo.exe");
ProcessWithData procwithdata = (ProcessWithData)proc;
应在强制转换时销毁已退出的事件处理程序
我怎样才能在不重新定义和破坏Process类内现有实例的情况下为其设置private修饰符呢?我同意@madreflection的观点,认为包装器或装饰器是可行的。也就是说,使用基设置有问题的属性将起作用
public class ProcessWithData : Process
{
public ProcessWithData(string filename)
{
base.StartInfo.FileName = filename;
}
public EventHandler CurrentEventHandler { get; private set; }
public void SetHandler(EventHandler eventHandler)
{
// set Exited via base object
if (CurrentEventHandler != null) base.Exited -= CurrentEventHandler;
CurrentEventHandler = eventHandler;
base.Exited += CurrentEventHandler;
}
}
。。。像这样使用它,它有点冗长,但它工作
var proc = new ProcessWithData("foo.exe");
proc.SetHandler(ProcOnExited);
proc.EnableRaisingEvents = true;
proc.Start();
private void ProcOnExited(object sender, EventArgs e)
{
// do stuff
}
如果您也展示了Process类,这会有所帮助。现在还不清楚你想做什么,也不清楚你是如何达到这种期望的,这种期望在某种程度上被摧毁了。也许你不需要重新申报退出;也许您需要在基类中将其虚拟化并重写它。现在还不知道,这是标准的System.Diagnostics.Process类,正如定义的那样。注意到的,我有点惊讶这个类没有被密封。无论如何,该进程不可能强制转换为ProcessWithData,因为Process.Start无法为您提供该进程的实例。首先,你想实现什么?我的蜘蛛侠感觉告诉我,你希望ProcessWithData要么是包装器,要么是装饰器,如果这对Process是可能的话。我如何设置私有修饰符,而不重新定义和破坏Process类内的现有实例您不能,请参阅标记的重复项。即使语言通常允许这样做,您仍然不能,因为基本成员不是虚拟的。您唯一的选择是无论如何隐藏它,而不是销毁它……它仍然在那里,可以通过使用类型化为基类的引用来使用。至于替代方案,对于堆栈溢出的格式来说,寻址范围太广。如果你在某些特定的问题上需要帮助,请随意发布一个新问题。经过适当的解释,我终于理解了这个问题。我的目标是将访问修饰符更改为基类中的一个元素,这就是为什么使用new使我认为它正在覆盖它——并且在施法时有效地消失了。类永远不应该用于以这种方式启动流程的常规方式,而应该作为process.getProcessByName中找到的实例的补充,但所讨论的示例在测试构建中。