여기에서 "확장 메서드를 동적으로 디스 패칭 할 수없는"원인은 무엇입니까?

.net c# compiler-errors dapper extension-methods

문제

컴파일 오류

'System.Data.SqlClient.SqlConnection'에는 'Query'라는 적용 가능한 메서드가 없지만 해당 이름으로 확장 메서드가있는 것으로 보입니다. 확장 메서드는 동적으로 디스패치 할 수 없습니다. 동적 인수를 형변환하거나 확장 메서드 구문없이 확장 메서드를 호출하는 것이 좋습니다.

이제는 문제를 해결하는 방법을 알고 있지만 오류 자체를 더 잘 이해하려고합니다. 나는 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");

그것은 잘 컴파일됩니다.

그래서, 다른 사람들과 동일한 오버로드를 활용하는 것이 그 오류로 인해 실패하는 이유를 이해시켜 주실 수 있습니까?

수락 된 답변

그래서, 다른 사람들과 동일한 오버로드를 활용하는 것이 그 오류로 인해 실패하는 이유를 이해시켜 주실 수 있습니까?

동적 값 ( param )을 인수 중 하나로 사용하고 있기 때문입니다. 즉 동적 디스패치를 ​​사용하지만 확장 메서드에는 동적 디스패치가 지원되지 않습니다.

솔루션은 간단합니다. 정적 메서드를 직접 호출하면됩니다.

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

(물론 paramdynamic 유형이 필요하다고 가정 할 때 ... 물론 주석에 언급 된 것처럼 object 변경하는 것이 좋을 수도 있습니다.)


인기 답변

같은 문제에 대한 또 다른 해결책은 동적 값에 유형 변환을 적용하는 것입니다.

같은 컴파일 오류가 발생했습니다 :

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

다음을 수행하여 해결되었습니다.

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

참고 :이 경우 동적 값은 문자열로 잘 알려져 있습니다. 존재하는 문자열 연결에 의해 강화 된 사실.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.