Я использую интерфейс-перехватчик для кэширования всех методов, начинающихся с «Get», но я не могу понять, как создать уникальный кеш-ключ для каждого неизвестного параметра, который он может быть любым, и использование GetHashCode не является опцией, так как я не могу быть на 100% уверен, что они переопределили GetHashCode.Замок Core Invocation создает ключ кэша от перехваченного метода
некоторые мысли было коснуться в линии 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, строка и т.д.
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);
}