【发布时间】:2014-01-29 18:37:48
【问题描述】:
我正在编写一个通用包装类来实现INotifyPropertyChanged 用于我的另一个类中的一堆属性。我一直在对implicit 转换运算符进行一些研究,但我对如何在泛型类中使用它有点困惑。本质上,我想获得内部包装的值,而无需显式调用内部属性。我正在寻找的行为本质上是Nullable<T> 类/结构的工作方式,如果内部值不是null,那么它将直接返回内部包装的值。示例如下:
//current behavior
MyWrapperClass<int> wrapped = new MyWrapperClass();
int startCount = wrapped.Data;
//behavior I am looking to implement
int startCount = wrapped
在上面的第二个示例中,wrapped 将返回它的内部包装值而不是类型 T 而不必调用内部属性。这就是Nullable<T> 的行为方式。
在研究隐式转换时,我似乎需要根据这篇 MSDN 文章事先知道类型:Using Conversion Operators
由于类型未知,我是否需要转换 dynamic 类型?示例:
public static implicit operator dynamic(MyWrapperClass w)
或者我可以对类型 T 执行隐式转换,如下所示?这将阻止我将方法设为静态,我注意到在我看到的所有示例代码中都使用了该方法,涉及隐式和显式转换运算符。这个选项对我来说似乎是“错误的”,但我在这里找不到关于这个主题的太多信息。
public implicit operator T(MyWrapperClass w)
编辑:这个SO Question 可能会导致它被标记为骗子,但接受的答案不是我想要的,因为他们说要使用我已经在做的属性。
【问题讨论】:
-
这不是您的问题的答案——而只是一个观察...您可以使用 AOP 使您的类实现 INotifyPropertyChanged 吗?像 Fody github.com/Fody/PropertyChanged 或 Postsharp postsharp.net 之类的?
-
感谢您的建议!我以前从未使用过 Fody 或 PostSharp,但我一定会调查一下。本质上这是这样做的,因此如果修改了属性,将设置一个标志以将它们保存回最初生成它们的配置文件中。您能否举例说明如何使用这些解决方案中的任何一种来做到这一点?
-
Fody 很简单 - 使用 NuGet 将 Fody(PropertyChanged.Fody 可以)安装到您的项目中,然后用 [ImplementPropertyChanged] 装饰您的类...就是这样 - 您的属性现在在何时实现 INotifyPropertyChanged建成!我知道 PostSharp 可以做到(谷歌 LocationInterceptionAspect 自己做),但我有免费许可证,这是一个“付费”功能,所以我从来没有通过魔法属性做到这一点。这两个都将 INotifyPropertyChged 的实现编织到 MSBuild 编译后的输出代码中(我认为 - 这有点像魔术!)祝你好运!
标签: c# generics casting implicit-conversion