Мне нужно создать класс, унаследованный от 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);
    }
}

Но я получаю сообщение об ошибке: я не могу переопределить метод, который не отмечен как виртуальный, абстрактный или переопределяемый. Я пытался заменить «переопределить» на «новый», но таким образом событие никогда не возникает ..

Как я могу перехватить настоящий "OnCreated" и заменить своим?

Спасибо

2
Ciccio 18 Ноя 2014 в 14:35

4 ответа

Лучший ответ

Вам не нужно заменять 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);
    }
}
2
IS4 18 Ноя 2014 в 11:44

Вы не можете.

Если вы пытаетесь изменить то, что делает обработчик по умолчанию, забудьте об этом, вы не сможете. Если вы хотите добавить свое собственное поведение, вы можете просто создать новый обработчик и подписаться на событие.

1
dcastro 18 Ноя 2014 в 11:42

Предположим, у нас есть сценарий

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. Вот что означает «новый» - он создает новый метод.

Однако, если бы мы сделали BaseClass.M виртуальным и пометили SubClass.M как переопределение, то оба они напечатали бы «Подкласс», потому что виртуальные вызовы проверяют тип времени выполнения вызывающего. Это объясняет, почему ваше событие никогда не запускается.

Как рекомендует IllidanS4, лучший способ - добавить слушателя к FileSystemWatcher.Created и заставить его вызывать LocalFolderWatcher.

1
MariusUt 18 Ноя 2014 в 11:51

Вы можете подписаться на событие OnCreated в FileSystemWatcher, а затем вызвать свой собственный метод

0
redspidermkv 18 Ноя 2014 в 11:43