2010-08-23 7 views
0

J'ai cette classe:C# 4 méthode Intercept appel

public class MyClass { 
    public string GetText() { 
     return "text"; 
    } 
} 

Ce que je veux est d'avoir une méthode de mise en cache générique. Si GetText est appelé, je veux intercepter cet appel, quelque chose comme;

public T MethodWasCalled<T>(MethodInfo method) { 
    if(Cache.Contains(method.Name)) { 
     return Cache[method.Name] as T; 
    } 
    else { 
     T result = method.Invoke(); 
     Cache.Add(method.Name, result); 
     return result; 
    } 
} 

J'espère que ce qui précède explique ce que je veux accomplir. Quelle serait une bonne stratégie pour cela?

Répondre

2

PostSharp L'Aspect Boundry peut être ce dont vous avez besoin.

Certains Elaboration:

PostSharp est une bibliothèque accumulation processus qui injecte dans votre IL binaire au moment de la compilation pour exposer la fonctionnalité dans les Availiable non limites de .NET régulière. L'aspect Boundry vous permet d'exécuter du code avant et après l'accès d'un membre. "Envelopper" l'appel, vous permettant de faire de la logique.

2

Si vous utilisez .NET 4, jetez un oeil à Lazy<T>.

public class MyClass { 
    private Lazy<string> _text = new Lazy<string>(
     () => { 
      return "text"; // expensive calculation goes here 
     }); 

    public string GetText() { 
     return _text.Value; 
    } 
} 

Le code à l'intérieur du lambda ne sera exécuté qu'une seule fois. C'est même threadsafe par défaut.

+0

Doh, je l'utilise tout le temps pour! – ChaosPandion