2016-09-16 11 views
0

Я использую интерфейс-перехватчик для кэширования всех методов, начинающихся с «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); 
} 

ответ

0

Я закончил с использованием GetHashCode, как это единственное жизнеспособное решение, если он не переопределяет метод, который он не будет кэшировать.