sharp net name method extensions extension extended enum create c# .net compiler-errors extension-methods dapper

c# - net - ¿Qué causa "los métodos de extensión no pueden ser enviados dinámicamente" aquí?



extended methods (2)

Entonces, ¿alguien puede ayudarme a comprender por qué está fallando ese error al aprovechar la misma sobrecarga dentro de esos otros métodos?

Precisamente porque estás usando un valor dinámico ( param ) como uno de los argumentos. Eso significa que usará el envío dinámico ... pero el envío dinámico no es compatible con los métodos de extensión.

Sin embargo, la solución es simple: simplemente llame directamente al método estático:

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

(Suponiendo que realmente necesita que los param sean de tipo dynamic , por supuesto ... como se indica en los comentarios, puede que esté bien simplemente para cambiarlo a object ).

Error de compilación

''System.Data.SqlClient.SqlConnection'' no tiene un método aplicable llamado ''Consulta'', pero parece tener un método de extensión con ese nombre. Los métodos de extensión no pueden ser enviados dinámicamente. Considere lanzar los argumentos dinámicos o llamar al método de extensión sin la sintaxis del método de extensión.

Ahora, sé cómo solucionar el problema, pero estoy tratando de comprender mejor el error en sí. Tengo clases que estoy construyendo para aprovechar Dapper. Al final, proporcionaré algunas funcionalidades más personalizadas para hacer que nuestro tipo de acceso a los datos sea mucho más ágil. En particular la construcción en el rastreo y esas cosas. Sin embargo, ahora mismo es tan simple como esto:

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); } }

pero curiosamente, si simplemente emitiera una declaración como esta:

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

se compila bien.

Entonces, ¿alguien puede ayudarme a comprender por qué está fallando ese error al aprovechar la misma sobrecarga dentro de esos otros métodos?


Otra solución para el mismo problema es aplicar la conversión de tipos al valor dinámico.

Encontré el mismo error de compilación con:

Url.Asset( "path/" + article.logo );

Lo que se resolvió haciendo:

Url.Asset( "path/" + (string) article.logo );

Nota: el valor dinámico es bien conocido como una cadena, en este caso; Un hecho reforzado por la concatenación de cuerdas que está presente.