我有一个 lambda 表达式,它接受int?
(可为空整数),
如果值存在则返回值或DBNull.Value http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx否则。
Func<int?, object> getId = id => id.HasValue ? id.Value : (object)DBNull.Value;
这里的目标是,我想让该表达式稍微通用一些,以便我可以传递任何可为 null 的类型,例如DateTime?
所以这是我开始使用的非功能代码,但不确定where指定可为空的type.
int? imageId;
DateTime? actionDate;
Func<Nullable<T>, object> getValue =
id => id.HasValue ? id.Value : (object) DBNull.Value;
SaveImage(getValue(imageId), getValue(actionDate));
是否可以指定泛型类型或者我应该创建一个命名函数来执行此操作?
由于问题的目的是使用 lambda 表达式,因此这里有一个解决方案。它采用了不同的路线,使用弱类型而不是建议的强类型,但仍然完成了相同的事情。
// A lambda solution
Func<object, object> fnGetValue =
v =>
ReferenceEquals(v, null)
? DBNull.Value
: v;
// Sample usage
int? one = 1;
int? two = null;
object o1 = fnGetValue(one); // gets 1
object o2 = fnGetValue(two); // gets DBNull
Edit:这种松散类型之所以有效,是因为 lambda 参数 v 的数据类型属于结构本身,而不是 Nullable 类型包装器。显然,当调用者使用 lambda 参数并且 lambda 参数显示结构体值或 null 时,调用者使用的 Nullable 值已被解析或“解包”;此时(或者据我所知)看不到 Nullable 包装器。可以通过在 lambda 中的 v 处放置调试断点并检查其值来证明此行为。
这种行为的好处是 lambda 对于 Nullable 和非 Nullable 类型同样适用——它不受限制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)