【问题标题】:Wrapped value extension method / operator包装值扩展方法/运算符
【发布时间】:2014-03-17 12:53:52
【问题描述】:

假设我有通用值包装器:

class Wrapper<T>
{
    public T Value { get; set; }
}

我想按照下面列出的方式使用它(或类似的东西):

var wrapper = new Wrapper<Target>();
// ...
Target target = wrapper;

如何使用隐式运算符、扩展方法或其他方法来提供单一位置空值检查?作为好处之一,我想将以下代码保留在一个地方:

if (wrapper != null)
{
    return wrapper.Value;
}

return default(T);

编辑:

我试过运算符:

public static implicit operator T(Wrapper<T> wrapper)
{
    return wrapper.Value ? default(T) : wrapper.Value;
}

下面的方法非常有效:

var wrapper = new Wrapper<long>();
long value = wrapper;

但失败了:

var wrapper = new Wrapper<IEnumerable<long>>();
IEnumerable<long> value = wrapper;

编译器说无法从Wrapper&lt;IEnumerable&lt;long&gt;&gt; 转换为IEnumerable&lt;long&gt;。有什么想法吗?

【问题讨论】:

  • T 会在这里做什么?任何事物?仅不可为空的值类型(又名where T:struct)?还是...?
  • 任何东西。是否有针对不同约束的多种不同解决方案?
  • 对于不可为空的值类型,只有包装器可以为空;对于引用类型,包装器及其值都可以为空。所以你要么有一张或两张支票。
  • 无需查看Value。如果是== default(T),那么可以让它返回。这里没有问题。
  • @SergeyMetlov:糟糕,我忘了。不幸的是,据我了解,您无法在接口上执行用户定义的转换:stackoverflow.com/a/4280626/1269654(例如,如果您将其从IEnumerable&lt;long&gt; 更改为List&lt;long&gt;,则转换将起作用。)编辑:错误消息很漂亮坏的。如果您将其更改为 just IEnumerable(没有通用参数),它会说:“不允许用户定义的与接口之间的转换”

标签: c#


【解决方案1】:

您可以使用隐式运算符:

public static implicit operator T(Wrapper<T> value)
{
    return value == null ? default(T) : value.Value;
}

编辑

正如@ChrisSinclair 所指出的,当 T 是接口时,这不起作用,唯一可以想到的解决方案是使用扩展方法,例如:

public static T SafeGetValue<T>(this Wrapper<T> value)
{
    return value == null ? default(T) : value.Value;
}

然后:

IEnumerable<long> value = wrapper.SafeGetValue();

【讨论】:

  • 请参阅上面有问题的我的编辑。
【解决方案2】:
return wrapper.Value ?? default(T);

【讨论】:

  • wrapper 可以为空。
  • @SergeyMetlov 是的,没注意到
【解决方案3】:

可以在通用包装器本身中进行空值检查,如下所示。

class Wrapper<T>
{
    private T _value;
    public T Value
    {
       get
       {
         return _value ?? default(T);
       }
       set
       {
         _value = value;
       };
    }
}

【讨论】:

  • 主要思路是检查Wrapper不为空。
猜你喜欢
  • 2010-10-15
  • 2014-07-31
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 2017-11-07
  • 2020-08-25
  • 2011-07-27
  • 2010-09-15
相关资源
最近更新 更多