【问题标题】:Implicit C# Conversion For Generic Wrapper Class通用包装类的隐式 C# 转换
【发布时间】: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&lt;T&gt; 的行为方式。

在研究隐式转换时,我似乎需要根据这篇 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


【解决方案1】:

经过一些测试,第二个选项似乎没有问题,并且仍然允许自己是静态的。我使用@AndersForsgren 对this question 的回答(不接受的回答)来解决这个问题。显然我误解了隐式运算符重载的工作原理。纠正这个问题的代码sn-p如下:

public static implicit operator T(WrapperClass<T> input)
{
     return input.Data;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    相关资源
    最近更新 更多