c# - 如何将泛型类型参数传递给 lambda 表达式?

标签 c# .net generics lambda

我有一个接受 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/

相关文章:

c# - 使用数据库中的复选框填充 StackPanel

c# - 是否有任何使用 TCP 套接字从中收集数据来读取 http 请求的示例(例如以某种方式模拟 Http 服务器)

c# - 将文本添加到带有图标的按钮

c# - Xamarin HttpClient 请求超时

c# - ASP.NET mvc4 DropDownListFor 传回一个对象

generics - Kotlin 泛型更改返回类型

swift - 为通用结构提供专门的初始化器

java - 通用Java代码难懂?

c# - 非阻塞锁定

javascript - 从 Javascript 文件访问 MVC 的模型属性