是什么原因导致这里“无法动态调度扩展方法”?

2023-12-29

编译错误

“System.Data.SqlClient.SqlConnection”没有名为“Query”的适用方法,但似乎有一个使用该名称的扩展方法。扩展方法无法动态分派。考虑转换动态参数或在不使用扩展方法语法的情况下调用扩展方法。

现在,我知道如何解决该问题,但我正在尝试更好地理解错误本身。我正在构建一个课程来利用 Dapper。最后,我将提供一些更多的自定义功能,使我们的数据访问类型更加简化。特别是在跟踪和其他方面进行构建。然而,现在就这么简单:

public class Connection : IDisposable
{
    private SqlConnection _connection;

    public Connection()
    {
        var connectionString = Convert.ToString(ConfigurationManager.ConnectionStrings["ConnectionString"]);
        _connection = new SqlConnection(connectionString);
        _connection.Open();
    }

    public void Dispose()
    {
        _connection.Close();
        _connection.Dispose();
    }

    public IEnumerable<dynamic> Query(string sql, dynamic param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null)
    {
        // this one works fine, without compile error, so I understand how to
        // workaround the error
        return Dapper.SqlMapper.Query(_connection, sql, param, transaction, buffered, commandTimeout, commandType);
    }

    public IEnumerable<T> Query<T>(string sql, dynamic param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null)
    {
        // this one is failing with the error
        return (IEnumerable<T>)_connection.Query(sql, param, transaction, buffered, commandTimeout, commandType);
    }
}

但有趣的是,如果我简单地发表这样的声明:

_connection.Query("SELECT * FROM SomeTable");

它编译得很好。

那么,有人可以帮助我理解为什么在其他方法中利用相同的重载会失败并出现该错误吗?


那么,有人可以帮助我理解为什么在其他方法中利用相同的重载会失败并出现该错误吗?

正是因为您使用的是动态值(param) 作为参数之一。这意味着它将使用动态调度...但扩展方法不支持动态调度。

解决方案很简单:直接调用静态方法即可:

return SqlMapper.Query(_connection, sql, param, transaction,
                       buffered, commandTimeout, commandType);

(假设你真的需要param属于类型dynamic,当然...正如评论中所指出的,您可能可以将其更改为object.)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是什么原因导致这里“无法动态调度扩展方法”? 的相关文章

随机推荐

  • 仍然对协变和逆变以及输入/输出感到困惑

    好的 我在 stackoverflow 上读了一些关于这个主题的内容 观看了this http msdn microsoft com en us vcsharp ee672319 aspx this http channel9 msdn c
  • 托管 C++ 与非托管/本机 C++ 的性能

    我正在编写一个非常高性能的应用程序 每毫秒处理和处理数百个事件 非托管 C 比托管 C 更快吗 为什么 托管 C 处理 CLR 而不是操作系统 并且 CLR 负责内存管理 这简化了代码 并且可能比 程序员 在非托管 C 中编写的代码更高效
  • Django-REST 中关系字段的 KeyError

    我有以下型号 class ProductColor models Model color title models CharField max length 50 class BasicProduct models Model produc
  • Laravel 迁移添加外键的最佳方式

    简单的问题 我是 Laravel 的新手 我有这个迁移文件 Schema create lists function Blueprint table table gt increments id table gt string title
  • 如何在 jquery 中使用单个取消委托方法删除多个事件委托

    我可以使以下内容变得更简单 而不是使用 取消委托 两次 吗 div1 undelegate div mouseenter undelegate div mouseleave 我不希望除 mouseenter 和 mouseleave 之外的
  • 哪些后端正在消耗 Google Container Engine Kubernetes 配额

    我正在尝试在 Google Container Engine 上的 Kubernetes 上设置 Ingress 但收到超出配额的错误 请参阅下面的简短输出 Name my ingress Address Default backend d
  • 基于表单字段的查询条件

    因此 我有一个查询 在其中选择一个字段并设置条件 以便它仅根据表单中特定字段的当前值选择记录 标准看起来像这样 Forms FORMAL CERT REVIEW CHECK FORM REVIEW CHECK ID 很简单的东西 但我遇到了
  • 基于 HR 标签,使用 Javascript/JQuery 将 HTML 拆分为 div

    我想根据 HR 标签将从 Web 服务收到的文章 HTML 内容 拆分到不同的 DIV 中 我用一个例子来解释 这是我从服务中收到的 p This is an article bla bla p hr p this is the next
  • MFC 获取文件夹

    嘿 我如何在 MFC 中获取所有文件夹的名称 有什么例子或者我应该研究哪些课程 任何提示将非常感激 我所看到的只是 CFile 据我所见 尽管非常非常少 它看起来没有能力做我想做的事情 所以请指导我 Thanks 调查C文件查找 http
  • 无法在设置中更改 Android 应用程序名称

    我使用 ADT Eclipse 中的向导创建了一个应用程序 我在 strings xml 中编辑了应用程序名称 这更改了启动器图标上的标签 但是 如果我进入 设置 gt 应用程序 它会显示旧名称 我尝试卸载该应用程序 清理并再次运行 但它仍
  • JavaScript - 无法正确添加 2 个数字

    我正在使用 Javascript 模拟计算器 用户可以在给定的文本框中输入 2 个数字 它将显示总和 乘积 差值和除法 这是我的功能 function calculate num1 num2 console log First Number
  • Python pip 无法在 Linux mint 上运行

    我已经遇到这个错误一年了 但仍然找不到解决方案 我正在使用 Linux Mint 17 3 每次我尝试使用 pip 安装某些东西时 都会遇到一堆异常 pip install U scikit learns Exception Traceba
  • 我可以从 .html 页面链接到 .ejs 页面吗?

    我正在制作一个网页 并且一直在 stackoverflow 上查找如何从 html 文件链接到 ejs 文件 人们在说以下内容 在index html中 li a href twitter Twitter a li 在 script js
  • 在 React 中单击组件外部时更改状态

    I have a dropdown as is shown in the following image 当我单击文件夹图标时 它会打开和关闭 因为showingProjectSelector属性处于设置为 false 的状态 constr
  • 熊猫由长到宽的重塑,通过两个变量

    我有长格式的数据 并且正在尝试将其重塑为宽格式 但似乎没有一种简单的方法可以使用熔化 堆叠 取消堆叠来执行此操作 Salesman Height product price Knut 6 bat 5 Knut 6 ball 1 Knut 6
  • Java JUnit 测试无法使用 @Before 注释

    嘿 com 开始进行 Java JUnit 测试并遇到有关 Before 注释的问题 我的设置 爪哇9 日食氧气 J单元5 如果我这样进行测试 package junittesting import org junit jupiter ap
  • 当控制流关闭函数结束而没有返回时,为什么仍然有返回值?

    include
  • ASP.Net MVC JQuery Ajax 调用不返回任何内容

    是否可以通过ajax 在我的例子中使用JQuery 从视图到控制器进行不返回任何内容的调用 我只是在会话中设置一些变量 没有可显示的输出 我尝试将控制器上的方法设置为无效 但它不起作用 现在我已将方法返回标记为 JsonResult 并且我
  • Java Swing JLayeredPane 未显示

    我似乎遇到了一些重大问题JLayeredPane 我有一个BorderLayout 我希望西侧元素包含一些相互重叠的 JLayeredPane 这样我就可以在它们之间切换以显示正确的信息 西窗格的宽度应为 200 像素 并且应与整个窗口一样
  • 是什么原因导致这里“无法动态调度扩展方法”?

    编译错误 System Data SqlClient SqlConnection 没有名为 Query 的适用方法 但似乎有一个使用该名称的扩展方法 扩展方法无法动态分派 考虑转换动态参数或在不使用扩展方法语法的情况下调用扩展方法 现在 我