Castle 核心调用从拦截的方法中创建一个缓存键

Castle Core Invocation create a cache key from intercepted method

我正在使用接口拦截器来缓存所有以 "Get" 开头的方法,但我不知道如何为每个未知参数生成唯一的缓存键,它可以是任何东西,使用 GetHashCode 是不是一个选项,因为我不能 100% 确定他们已经覆盖了 GetHashCode。

一些想法与

一致

其中 JSON 用于我正在考虑的 JObject JSON 序列化每个参数然后获取哈希码,如上面 link 中所述:

var obj = JToken.Parse(jsonString);
var comparer = new JTokenEqualityComparer();
var hashCode = comparer.GetHashCode(obj);

但是我认为这会影响性能,那么如何解决呢?

我目前的代码是这样的,但它无法处理复杂类型的情况,其中 .ToString 不会生成原始值类型,如 int、string 等。

private string CreateCacheKey(IInvocation invocation)
{
    string className = invocation.TargetType.FullName;
    string methodName = invocation.Method.Name;

    var builder = new StringBuilder(100);
    builder.Append(className);
    builder.Append(".");
    builder.Append(methodName);

    for (int i = 0; i < invocation.Arguments.Length; i++)
    {
        var argument = invocation.Arguments[i];
        var argumentValue = invocation.GetArgumentValue(i);
        builder.Append("_");
        builder.Append(argument);

        if (argument != argumentValue)
        {
            builder.Append(argumentValue);
        }
    }

    return string.Format("{0}-{1}", this.provider.CacheKey, builder);
}

我最终使用了 GetHashCode,因为如果不重写它不会缓存的方法,它是唯一可行的解​​决方案。