2013-03-13 13 views
27

compilazione errore

'System.Data.SqlClient.SqlConnection' non ha un metodo applicabile chiamato 'Query', ma sembra avere un metodo di estensione con quel nome. I metodi di estensione non possono essere inviati dinamicamente. Valuta la possibilità di trasmettere gli argomenti dinamici o chiamare il metodo di estensione senza la sintassi del metodo di estensione.Che cosa causa "i metodi di estensione non possono essere inviati dinamicamente" qui?

Ora, so come aggirare il problema, ma sto cercando di ottenere una migliore comprensione dell'errore stesso. Ho classe 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, in questo momento è semplice come questo:

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

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

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

si compila bene.

Quindi, qualcuno può aiutarmi a capire perché sfruttare lo stesso sovraccarico di questi altri metodi sta fallendo con quell'errore?

+0

@ pst, abbastanza giusto, non è tecnicamente gettato. –

+2

Perché è necessario il parametro dinamico, anziché il parametro oggetto? Non stai facendo alcuna operazione o chiamata di metodo su di esso. Tu sei? –

risposta

37

Quindi, qualcuno può aiutarmi a capire perché sfruttare lo stesso sovraccarico di questi altri metodi sta fallendo con quell'errore?

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

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

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

(che sei tu assumendo realmente bisogno param essere di tipo dynamic, ovviamente ... come notato nei commenti, si può ben va bene per cambiarlo a .)

+1

E questo è esattamente quello che stavo cercando ***, grazie mille Jon! Non ho alcun problema a lavorarci intorno, come hai fatto nel tuo esempio, e come ho fatto nel primo metodo, volevo solo sapere *** perché *** se questo ha un senso. E penso che lo cambierò in 'object' perché non ho bisogno di eseguire alcuna operazione contro di esso. –

+1

@MichaelPerrenoud probabilmente lo hai già trovato, ma il 'Foo' in questo caso è' SqlMapper'; quindi 'SqlMapper.Query (...)' –

+0

@MarcGravell: Grazie, risolto. –

1

Un'altra soluzione allo stesso problema è applicare il casting di tipo al valore dinamico.

ho incontrato 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 è ben noto per essere una stringa, in questo caso; un fatto rinforzato dalla concatenazione di stringhe che è presente.

Problemi correlati