0

私はこのクラスを持っています:

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

上記が私が達成したいことを説明していることを願っています。これにはどのような戦略が適していますか?

4

2 に答える 2

2

PostSharpの Boundry Aspect が必要な場合があります。

いくつかの詳細:

PostSharpは、コンパイル時に IL をバイナリに挿入して、通常の .NET の範囲内では利用できない機能を公開するビルド プロセス ライブラリです。

Boundry アスペクトを使用すると、メンバー アクセスの前後にコードを実行できます。効果的に呼び出しを「ラップ」し、派手なロジックを実行できるようにします。

于 2010-08-23T22:37:51.853 に答える
2

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

ラムダ内のコードは一度だけ実行されます。デフォルトでもスレッドセーフです。

于 2010-08-24T14:44:17.507 に答える