如何重写没有标记为虚拟的事件处理程序?

3

我需要创建一个继承自 FileSystemWatcher 的类。我应该拦截事件 OnCreated 并创建我的自定义事件 OnCreated。我尝试了以下方式:

public class LocalFolderWatcher : FileSystemWatcher, IWatcher
{
    ...
    public event LocalFolderEventHandler Created;

    protected override void OnCreated(FileSystemEventArgs e)
    {
        string path = System.IO.Path.GetDirectoryName(e.FullPath);
        LocalFolderEventArgs args = new LocalFolderEventArgs(e.ChangeType, this._gatewayConfigurationName, path, this._folderConfigurationName, e.Name);

        if (Created != null && base.EnableRaisingEvents && base.Path != null)
            Created(this, args);

        base.OnCreated(e);
    }
}

但我得到错误提示:我不能重写一个没有标记为virtual、abstract或override的方法。我尝试用"new"代替"override",但这样事件就不会被触发了。
我该如何截获真正的"OnCreated"并替换为我的方法呢?
谢谢。
4个回答

3

您无需替换OnCreated,只需创建自己的处理程序并将其传递给Created事件即可。

public class LocalFolderWatcher : FileSystemWatcher, IWatcher
{
    //...
    public event LocalFolderEventHandler CustomCreated;

    public LocalFolderWatcher()
    {
        Created += OnCreated;
    }

    private new void OnCreated(object sender, FileSystemEventArgs e)
    {
        string path = System.IO.Path.GetDirectoryName(e.FullPath);
        LocalFolderEventArgs args = new LocalFolderEventArgs(e.ChangeType, this._gatewayConfigurationName, path, this._folderConfigurationName, e.Name);

        if (CustomCreated != null && base.EnableRaisingEvents && base.Path != null)
            CustomCreated(this, args);
    }
}

我希望只有一个事件被“创建”。。这样一来,我就必须为CustomeCreated创建一个处理程序。:( 然而,如果没有其他解决方案,那就没关系了...谢谢 - Simone
当然,您也可以将其更改为 public new event LocalFolderEventHandler Created;,然后 base.Created += OnCreated;。然后将每个 CustomCreated 更改为 Created - IS4
嗨@IllidanS4wantsMonicaback,恕我直言,您能否也检查一下这个问题?https://stackoverflow.com/questions/64238735/to-prevent-entering-special-characters-on-textbox-already-have-thousand-of-tex - Prageeth Liyanage
@Banjo 我认为那个问题已经得到足够的回答了。 - IS4
@IllidanS4supportsMonica 没有朋友回答得正确。我需要覆盖文本框当前的按键事件并运行我的验证代码,如果在按键事件中有任何明确提到的代码,则还需要运行。 - Prageeth Liyanage

1
你做不到。
如果你想要修改默认处理程序的行为,那就别想了,你做不到。如果你想要添加自己的行为,那么你只需要创建一个新的处理程序并订阅事件即可。

1
假设我们有以下场景。
class BaseClass { public void M() { Console.WriteLine("BaseClass"); } }
class SubClass { public new void M() { Console.WriteLine("SubClass"); } }

void Main() {
    var x = new SubClass();
    x.M(); // Prints "SubClass"
    ((BaseClass)x).M(); // Prints "BaseClass"
}

在第一个例子中,调用的是SubClass.M,而在第二个例子中,调用的是BaseClass.M。这就是“new”的含义 - 它创建了一个新方法。
然而,如果我们将BaseClass.M定义为虚拟方法并标记SubClass.M为重写方法(override),那么两个方法都会打印出“SubClass”,因为虚拟调用检查调用者的运行时类型。这就解释了为什么你的事件从未被触发。
正如IllidanS4所建议的那样,最好的方法是向FileSystemWatcher.Created添加一个侦听器,并让它调用LocalFolderWatcher

0
你可以订阅 FileSystemWatcher 的 OnCreated 事件,然后调用自己的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接