我想在单声道下运行此功能(我的当前版本是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);
    }

但是它失败并显示以下错误:
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?
ClientConnectionId的Mono等价于什么?或者我该如何解决?

最佳答案

单声道SqlConnection类未实现ClientConnectionId。如果您确实想为每个实例都具有一些唯一标识符,则可以自己完成,就像从哈希码构造一个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
    }
}

那么您可以在您的方法中使用它:
if (prop == "ClientConnectionId")
{
    return _conn.GetClientConnectionId();
}

附言:

可以在不同的时间点为2个不同的实例重复该哈希码。

附注(2):
__MonoCS__仅由mono编译器定义。 Mono编译器看不到调用ClientConnectionId属性的部分,反之亦然。

附注(3):

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

关于c# - 等价的ClientConnectionId,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31354064/

10-13 03:25