包装值扩展方法/操作符



假设我有一个通用值包装器:

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

我想使用它如下所列(或类似这样):

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

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

if (wrapper != null)
{
    return wrapper.Value;
}
return default(T);
编辑:

I tried the operator:

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

这是完美的工作在下面的方式:

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

But fails on:

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

编译器说不可能从Wrapper<IEnumerable<long>>转换到IEnumerable<long>。什么好主意吗?

可以使用隐式操作符:

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

编辑:

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

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

然后:

IEnumerable<long> value = wrapper.SafeGetValue();
return wrapper.Value ?? default(T);

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

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

最新更新