2013-03-13 46 views
27

編譯錯誤

「System.Data.SqlClient.SqlConnection」有一個名爲「查詢」不適用的方法,但似乎有這個名字的擴展方法。擴展方法不能動態分派。考慮轉換動態參數或調用擴展方法而不使用擴展方法語法。什麼原因導致「擴展方法不能動態調度」在這裏?

現在,我知道如何解決這個問題,但我試圖更好地理解錯誤本身。我有我正在建設的課程來利用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"); 

它編譯就好了。

那麼,有人可以幫助我理解,爲什麼利用這些其他方法中的相同超載失敗,出現該錯誤?

+0

@pst,夠公平的,它沒有在技術上拋出。 – 2013-03-13 16:37:25

+2

爲什麼你需要動態參數,而不是對象參數?你沒有對它進行任何操作或方法調用。你是? – 2013-03-13 16:40:12

回答

37

那麼,有人可以幫助我理解爲什麼利用這些其他方法中的相同的重載失敗的錯誤?

正是因爲您使用動態值(param)作爲參數之一。這意味着它將使用動態分派...但動態分派不支持擴展方法。

解決方法很簡單,但:只是直接調用靜態方法:

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

(這是假設你真的需要paramdynamic類型,當然......在評論中指出,你可能只需將其更改爲object即可。)

+1

這就是我正在尋找的*** ***,非常感謝喬恩!我沒有任何問題可以解決它,就像你在你的例子中做的那樣,就像我在第一種方法中做的那樣,我只是想知道***爲什麼***如果這是有道理的。我想我會將它改爲'object',因爲我不需要對它進行任何操作。 – 2013-03-13 16:43:10

+1

@MichaelPerrenoud你可能已經找到了這個,但是'Foo'在這種情況下是'SqlMapper';所以'SqlMapper.Query(...)' – 2013-03-14 14:01:39

+0

@MarcGravell:謝謝,修正。 – 2013-03-14 14:22:43

1

解決同一問題的另一種解決方案是將類型轉換應用於動態值。

我遇到了同樣的編譯錯誤有:

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

這是由這樣解決:

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

注:動態值是衆所周知的是一個字符串,在這種情況下,一個由現有字符串連接加強的事實。

相關問題