说我有通用值包装器:
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>
。有什么想法吗?
答案 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;
};
}
}