C# 如何在不隐藏类基变量的情况下更改访问修饰符?

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

我正在尝试稍微扩展Process类,以添加Process.Exit委托的访问控制,并将其限制为一个。到目前为止,我有一个结果:

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中找到的实例的补充,但所讨论的示例在测试构建中。