2013-03-13 5 views
27

Compile Error

«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, справедливо, это не технически брошено. –

+2

Зачем вам нужен динамический параметр, а не параметр param? Вы не выполняете никаких операций или вызовов метода. Ты? –

ответ

37

Итак, может кто-нибудь, пожалуйста, помогите мне понять, почему использование такой же перегрузки внутри этих других методов не срабатывает с этой ошибкой?

Именно потому, что вы используете динамическое значение (param) в качестве одного из аргументов. Это означает, что он будет использовать динамическую отправку ... но динамическая отправка не поддерживается для методов расширения.

Решение простое, хотя: просто вызвать статический метод непосредственно:

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

(Вот вам предполагая действительно нужно param быть типа dynamic, конечно ... как отмечено в комментариях, вы можете также чтобы просто изменить его на object.)

+1

И это *** именно то, что я искал ***, большое спасибо! У меня нет проблем с этим работать, как в вашем примере, и, как и в первом методе, я просто хотел узнать, почему ***, если это имеет смысл. И я думаю, что я изменю его на «объект», потому что мне не нужно выполнять какие-либо операции против него. –

+1

@MichaelPerrenoud вы, вероятно, уже нашли это, но 'Foo' в этом случае является' SqlMapper'; поэтому 'SqlMapper.Query (...)' –

+0

@MarcGravell: Спасибо, исправлено. –

1

Другим решением этой проблемы является применение литья типа к динамическому значению.

я столкнулся с той же ошибки компиляции с:

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

Какой была решена, выполнив:

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

Примечание: динамическое значение хорошо известно, что строка, в данном случае; факт, подкрепленный конкатенацией строк, которая присутствует.

 Смежные вопросы

  • Нет связанных вопросов^_^