Mono相当于ClientConnectionId

ags*_*udy 9 c# sql-server mono sqlclient

我想在mono下运行这个功能(我目前的版本是4.0.2)

 public Object GetConnectionProperty(SqlConnection _conn, string prop)
    {
        if (_conn.State == ConnectionState.Closed &
            prop == "ServerVersion")
            return string.Empty;

        if (prop == "ClientConnectionId")
        {
            Guid guid = _conn.ClientConnectionId;
            return guid.ToString();
        }
        return _conn.GetType().GetProperty(prop).GetValue(_conn);
    }
Run Code Online (Sandbox Code Playgroud)

但它失败了,错误:

error CS1061: Type `System.Data.SqlClient.SqlConnection' does not contain a 
definition for `ClientConnectionId' and no extension method 
`ClientConnectionId' of type `System.Data.SqlClient.SqlConnection' could be 
found. Are you missing an assembly reference?
Run Code Online (Sandbox Code Playgroud)

Mono相当于ClientConnectionId什么?或者我该如何解决?

man*_*nji 1

ClientConnectionId未在 Mono SqlConnection类中实现。如果您确实希望每个实例都有一些唯一的标识符,您可以自己做,因为有一个由哈希码构造的 id,例如:

public static class SqlClientExtensions {
#if __MonoCS__
    private static Dictionary<int, string> _connIds = new Dictionary<int, string>();
#endif

    public static string GetClientConnectionId(this SqlConnection conn) {
        if(conn == null) {
            return Guid.Empty.ToString();
        }

#if __MonoCS__
        if(!connIds.ContainsKey(conn.GetHashCode())) {
            connIds.Add(conn.GetHashCode(), Guid.NewGuid().ToString());
        }

        return connIds[conn.GetHashCode()];
#else
        return conn.ClientConnectionId.ToString();
#endif
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在你的方法中使用它:

if (prop == "ClientConnectionId")
{
    return _conn.GetClientConnectionId();
}
Run Code Online (Sandbox Code Playgroud)

附:

哈希码可以在不同时间点针对 2 个不同实例重复。

PS(2):

__MonoCS__仅由 mono 编译器定义。ClientConnectionIdMono 编译器看不到调用该属性的部分,对于其他部分和 .net 编译器来说反之亦然。

PS(3):

另一个解决方案是子类化SqlConnection并实现ClientConnectionId,但它是密封的......而且这还需要子类化一些SqlConnection在内部实例化该类的其他类。