我有一个接受 int?
(可为空整数)的 lambda 表达式,
如果值存在或 DBNull.Value
则返回值否则。
Func<int?, object> getId = id => id.HasValue ? id.Value : (object)DBNull.Value;
这里的目标是,我想让该表达式稍微更通用一些,以便我可以传递任何可为 null 的类型,例如 DateTime?
所以这是我开始时使用的非功能代码,但不确定在哪里指定可空的类型。
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
编辑:这种松散类型之所以有效,是因为 lambda 参数 v 的数据类型属于结构本身,而不是 Nullable 类型包装器。显然,调用者使用的 Nullable 值在遇到 lambda 参数时已被解析或“展开”,并且 lambda 参数显示结构值或 null;此时(或据我所知)无处可见 Nullable 包装器。可以通过在 v 处的 lambda 中放置调试断点并检查其值来证明此行为。 这种行为的好的副作用是 lambda 对于 Nullable 和非 Nullable 类型同样有效——它不受限制。
关于c# - 如何将泛型类型参数传递给 lambda 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1616047/