2013-03-13 20 views
27

Compile Lỗi

'System.Data.SqlClient.SqlConnection' không có phương pháp áp dụng có tên là 'Query' nhưng dường như có một phương pháp khuyến nông theo tên đó. Không thể gửi động các phương thức mở rộng. Xem xét truyền các đối số động hoặc gọi phương thức mở rộng mà không có cú pháp phương pháp mở rộng.Điều gì gây ra "phương pháp mở rộng không thể được gửi động" ở đây?

Bây giờ, tôi biết cách giải quyết vấn đề, nhưng tôi đang cố gắng hiểu rõ hơn về chính lỗi đó. Tôi có lớp mà tôi đang xây dựng để tận dụng Dapper. Cuối cùng, tôi sẽ cung cấp một số chức năng tùy chỉnh hơn để làm cho loại truy cập dữ liệu của chúng tôi được sắp xếp hợp lý hơn rất nhiều. Đặc biệt xây dựng trong truy tìm và các công cụ. Tuy nhiên, ngay lúc này nó cũng đơn giản như thế này:

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

nhưng điều thú vị đủ, nếu tôi được chỉ đơn giản là đưa ra một tuyên bố như thế này:

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

nó biên dịch tốt.

Vì vậy, ai đó có thể vui lòng giúp tôi hiểu tại sao tận dụng cùng một tình trạng quá tải bên trong của những phương pháp khác không thành công với lỗi đó?

+0

@pst, đủ công bằng, nó không được ném kỹ thuật. –

+2

Tại sao bạn cần tham số động, thay vì tham số đối tượng? Bạn không thực hiện bất kỳ thao tác hoặc phương thức nào trên đó. Bạn có phải? –

Trả lời

37

Vì vậy, ai đó có thể vui lòng giúp tôi hiểu tại sao tận dụng cùng một tình trạng quá tải bên trong các phương pháp khác không thành công với lỗi đó?

Chính xác vì bạn đang sử dụng giá trị động (param) làm một trong các đối số. Điều đó có nghĩa là nó sẽ sử dụng công văn động ... nhưng công văn động không được hỗ trợ cho các phương pháp mở rộng.

Giải pháp là đơn giản mặc dù: chỉ cần gọi phương thức tĩnh trực tiếp:

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

(Đó là giả định bạn thực sự cần param là loại dynamic, tất nhiên ... như đã nêu trong bình luận, bạn có thể cũng chỉ cần thay đổi nó thành object.)

+1

Và điều này là chính xác những gì tôi đang tìm kiếm ***, cảm ơn rất nhiều Jon! Tôi không có vấn đề gì khi làm việc xung quanh nó, như bạn đã làm trong ví dụ của bạn, và giống như tôi đã làm trong phương pháp đầu tiên, tôi chỉ muốn biết *** tại sao *** nếu điều đó có ý nghĩa. Và tôi nghĩ rằng tôi sẽ thay đổi nó thành 'đối tượng' bởi vì tôi không cần phải thực hiện bất kỳ hoạt động nào chống lại nó. –

+1

@MichaelPerrenoud bạn có thể đã tìm thấy điều này, nhưng 'Foo' trong trường hợp này là' SqlMapper'; vì vậy 'SqlMapper.Query (...)' –

+0

@MarcGravell: Cảm ơn, đã sửa. –

1

Một giải pháp khác cho cùng một vấn đề là áp dụng loại truyền cho giá trị động.

tôi gặp phải lỗi tương tự biên dịch với:

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

nào đã được giải quyết bằng cách thực hiện:

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

Lưu ý: giá trị động là nổi tiếng là một chuỗi, trong trường hợp này; một thực tế được củng cố bởi chuỗi nối có mặt.