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; } } |
之后,您可以在每个使用
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" |
这意味着您仍然可以保留语法,就好像您实际上在向
不幸的是,扩展属性在C中不存在。您需要创建一个继承FileSystemWatcher的子类。
在要使用的组件周围创建包装器。
继承的另一种选择是包装类,它修饰目标类。看看这里的装饰图案
如何创建从FileSystemWatcher派生的自己的类?您可以自由添加属性。