关于c#:使用.NET是否可以为内置对象(如FileSystemWatcher)分配自定义属性?

Using .NET is it possible to assign a custom property to a built in object such as FileSystemWatcher?

是否可以将自定义属性添加到.NET框架的一部分的对象中?

我知道如果我只是给一个我编写了一个属性的类,我会怎么做,但是给filesystemwatcher类添加一个自定义属性呢?

我正在从XML文件加载我要监视的路径,但也要添加一个属性来存储更多信息,在本例中是配置文件的位置。我可以将这个属性添加到filesystemwatcher类本身吗?


所以您想在添加属性的同时继承EDOCX1的所有功能吗?尝试继承类:

1
2
3
4
public class MyFileSystemWatcher : FileSystemWatcher
{
    public string XmlConfigPath { get; set; }
}

之后,您可以在每个使用System.IO.FileSystemWatcher的地方使用您的新类,如下所示:

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

另一种方法是创建一个类,该类将同时具有config文件位置和filesystemwatcher对象作为属性,沿着这些行:

1
2
3
4
5
6
7
8
9
10
public class MyFileSystemWatcherManager
{
    public string XmlConfigPath { get; set; }
    public FileSystemWatcher Watcher { get; set; }

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

使用方法如下:

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

即使不能继承基类,组合也是可能的,从OO的角度来看,它通常是首选的,因为使用类的大多数代码将只依赖于类,而不依赖于基类。但是,当您确实希望继承所有基本行为并只添加一些(定义良好的)额外行为时,继承是更简单、更紧密耦合的解决方案。


我必须承认,我不太明白你想做什么,但你可以这样解决你的问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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...

这将创建两个扩展方法,作为属性的getter/setter,您可以这样使用:

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

这意味着您仍然可以保留语法,就好像您实际上在向FileSystemWatcher类添加属性一样,因为您只调用该类,而不调用扩展。但是,您实际上只是在扩展类上包装一个静态属性。


不幸的是,扩展属性在C中不存在。您需要创建一个继承FileSystemWatcher的子类。


在要使用的组件周围创建包装器。


继承的另一种选择是包装类,它修饰目标类。看看这里的装饰图案


如何创建从FileSystemWatcher派生的自己的类?您可以自由添加属性。