我使用接口拦截器来缓存所有以" Get"但是我无法弄清楚如何为每个未知参数生成一个唯一的缓存键,它可以是任何东西,并且使用GetHashCode不是一个选项,因为我无法100%确定它们已经覆盖了GetHashCode。 / p>
How can I create a unique hashcode for a JObject?
中有些想法其中JSON用于JObject我正在考虑JSON序列化每个参数然后获取哈希代码,如上面链接中所述:
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);
}
答案 0 :(得分:0)
我最终使用了GetHashCode,因为它是唯一可行的解决方案,如果它不会覆盖它不会缓存的方法。