C # 4 Перехватить вызов метода - PullRequest
0 голосов
/ 24 августа 2010

У меня есть этот класс:

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

Я хочу иметь общий метод кэширования. Если вызывается GetText, я хочу перехватить этот вызов, что-то вроде;

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

Я надеюсь, что вышеизложенное объясняет, чего я хочу достичь. Что было бы хорошей стратегией для этого?

Ответы [ 2 ]

2 голосов
/ 24 августа 2010

Если вы используете .NET 4, взгляните на Lazy<T>.

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

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

Код внутри лямбды будет выполнен только один раз.Это даже потокобезопасный по умолчанию.

2 голосов
/ 24 августа 2010

PostSharp * Boundry Aspect * может быть тем, что вам нужно.

Некоторые разработки:

PostSharp - это библиотека процесса сборки, которая внедряет IL в ваш двоичный файл во время компиляции, чтобы показать функциональность, недоступную в пределах обычного .NET.

Boundry Aspect позволяет выполнять код до и после членского доступа. В действительности «оборачивая» вызов, позволяя вам сделать причудливую логику.

...