Cosa causa “i metodi di estensione non possono essere inviati dynamicmente” qui?

Compile Error

‘System.Data.SqlClient.SqlConnection’ non ha alcun metodo applicabile denominato ‘Query’ ma sembra avere un metodo di estensione con quel nome. I metodi di estensione non possono essere inviati dynamicmente. Valuta la possibilità di trasmettere gli argomenti dinamici o chiamare il metodo di estensione senza la syntax del metodo di estensione.

Ora, so come risolvere il problema, ma sto cercando di capire meglio l’errore stesso. Ho class che sto costruendo per sfruttare Dapper. Alla fine fornirò alcune funzionalità personalizzate per rendere il nostro tipo di accesso ai dati molto più snello. In particolare la costruzione di tracce e cose. Tuttavia, al momento è così semplice:

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 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 Query(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)_connection.Query(sql, param, transaction, buffered, commandTimeout, commandType); } } 

ma abbastanza interessante, se dovessi semplicemente rilasciare una dichiarazione come questa:

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

compila bene.

Quindi, qualcuno può aiutarmi a capire perché sfruttare lo stesso sovraccarico all’interno di quegli altri metodi sta fallendo con quell’errore?

Quindi, qualcuno può aiutarmi a capire perché sfruttare lo stesso sovraccarico all’interno di quegli altri metodi sta fallendo con quell’errore?

Proprio perché stai usando un valore dinamico ( param ) come uno degli argomenti. Ciò significa che utilizzerà la spedizione dynamic … ma la spedizione dynamic non è supportata per i metodi di estensione.

La soluzione è semplice: basta chiamare direttamente il metodo statico:

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

(Questo presuppone che tu abbia davvero bisogno che il param sia di tipo dynamic , ovviamente … come indicato nei commenti, potresti benissimo cambiarlo in object ).

Un’altra soluzione allo stesso problema è applicare il cast di tipo al valore dinamico.

Ho riscontrato lo stesso errore di compilazione con:

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

Che è stato risolto facendo:

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

Nota: il valore dinamico è noto per essere una stringa, in questo caso; un fatto rinforzato dalla concatenazione di stringhe che è presente.