包装值扩展方法/运算符

时间:2014-03-17 12:53:52

标签: c#

说我有通用值包装器:

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<IEnumerable<long>>转换为IEnumerable<long>。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

您可以使用隐式运算符:

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();

答案 1 :(得分:0)

return wrapper.Value ?? default(T);

答案 2 :(得分:0)

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

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