Используя .NET, можно ли назначить пользовательское свойство встроенному объекту, например FileSystemWatcher? - PullRequest
1 голос
/ 26 июля 2010

Можно ли добавить пользовательское свойство к объекту, который является частью .NET Framework?

Я знаю, как бы я это сделал, если бы просто давал класс, который написал свойство,но как насчет добавления пользовательского свойства в класс FileSystemWatcher?

Я загружаю в Путь, который я хочу просмотреть из файла XML, но также хочу добавить свойство для хранения дополнительной информации, в данном случаерасположение файла конфигурации.Могу ли я добавить это свойство в сам класс FileSystemWatcher?

Ответы [ 6 ]

8 голосов
/ 26 июля 2010

То есть вы хотите наследовать все функции FileSystemWatcher при добавлении ваших свойств? Попробуйте унаследовать класс:

public class MyFileSystemWatcher : FileSystemWatcher
{
    public string XmlConfigPath { get; set; }
}

и после этого вы можете использовать свой новый класс в любом месте, где вы бы использовали System.IO.FileSystemWatcher, например:

MyFileSystemWatcher fsw = new MyFileSystemWatcher();
fsw.XmlConfigPath = @"C:\config.xml";
fsw.Path = @"C:\Watch\Path\*.*";

Другой подход заключается в создании класса, который будет иметь как местоположение файла конфигурации, так и объект FileSystemWatcher в качестве свойства, следующим образом:

public class MyFileSystemWatcherManager
{
    public string XmlConfigPath { get; set; }
    public FileSystemWatcher Watcher { get; set; }

    public MyFileSystemWatcherManager()
    {
        Watcher = new FileSystemWatcher();
    }
}

и с использованием как это:

MyFileSystemWatcherManager manager = new MyFileSystemWatcherManager();
manager.XmlConfigPath = @"C:\config.xml";
manager.Watcher.Path = @"C:\Watch\Path\*.*";

Композиция возможна даже тогда, когда базовый класс не может быть унаследован, и, как правило, предпочтительнее с точки зрения ОО, поскольку большая часть кода, использующего ваш класс, будет полагаться только на ваш класс, а не на базовый класс. Однако, когда вы хотите наследовать всех базовых поведений и просто добавить некоторые (четко определенные) дополнительные функции, наследование является более простым и более тесно связанным решением.

1 голос
/ 26 июля 2010

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

public static class FileSystemWatcherExtensions
{
    public static Dictionary<string, string> MyProperty {get;set;}

    public static string GetMyProperty(this FileSystemWatcher watcher)
    {
        if (MyProperty != null && MyProperty.ContainsKey[watcher.GetHashCode()]) {
            return FileSystemWatcherExtensions.MyProperty[watcher.GetHashCode()];
        } else {
            return null;
        }
    }

    public static void SetMyProperty(this FileSystemWatcher watcher, string value)
    {
        if (MyProperty == null) {
            MyProperty = new Dictionary<string, string>();
        }
        FileSystemWatcherExtensions.MyProperty[watcher.GetHashCode()] = value;
    }
}
// I changed this example to allow for instance methods - but the naming can be
// improved...

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

var fsw = new FileSystemWatcher();
fsw.SetMyProperty("a string");
var val = fsw.GetMyProperty(); // val == "a string"

Это означает, что вы можете сохранить свой синтаксис , как если бы вывы фактически добавляете свойство к классу FileSystemWatcher в том смысле, что вы вызываете только этот класс, а не расширение.Однако на самом деле вы просто оборачиваетесь статическим свойством в классе расширения.

1 голос
/ 26 июля 2010

К сожалению, свойства расширения не существуют в c #. Вам необходимо создать дочерний класс, который наследует FileSystemWatcher.

1 голос
/ 26 июля 2010

Создайте оболочку вокруг компонента, который вы хотите использовать.

0 голосов
/ 26 июля 2010

Альтернативой наследованию будет класс-обертка, который украшает целевой класс.Проверьте образец декоратора здесь

0 голосов
/ 26 июля 2010

А как насчет создания вашего собственного класса, производного от FileSystemWatcher?Вы можете свободно добавлять свойства.

...