2016-09-16 2 views
0

J'utilise un intercepteur d'interface pour mettre en cache toutes les méthodes qui commencent par "Get" mais je n'arrive pas à comprendre comment générer une clé de cache unique pour chaque paramètre inconnu. être quelque chose et l'utilisation de GetHashCode n'est pas une option car je ne peux pas être sûr à 100% qu'ils ont surchargé le GetHashCode.Castle Core Invocation crée une clé de cache à partir de la méthode interceptée

quelques réflexions était someting dans la ligne de How can I create a unique hashcode for a JObject?

où JSON est utilisé pour un jobject je pensais à JSON sérialiser tous les paramètres puis obtenir le code de hachage comme expliqué dans le lien ci-dessus:

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

Cependant, je pense que ce sera un coup de performance alors comment cela peut-il être résolu?

Le code que j'ai à ce jour est cela, mais il gère l'habitude de la situation de type complexe où .ToString ne génère pas le type de valeur brute comme int, string, etc.

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); 
} 

Répondre

0

je me suis retrouvé à l'aide GetHashCode comme C'est la seule solution viable si elle ne remplace pas la méthode qu'elle ne cache pas.