1

さまざまな数と型のパラメーターを持つデリゲート メソッドを別のメソッドに渡す必要があります。私の希望は、呼び出し内のパラメーターの値を検査できることです。

これは私の汎用キャッシュ クラスです。

public T Get<T>(Expression<Func<T>> getItemCallback) where T : class
{

    T item = HttpRuntime.Cache.Get(hashRepresentationOfValues) as T;
    if (item == null)
    {
        item = getItemCallback.Compile()();
        HttpRuntime.Cache.Insert(
            hashRepresentationOfValues,
            item,
            null,
            DateTime.Now.AddMinutes(5),
            TimeSpan.Zero);
    }
    return item;
 }

私の呼び出しは次のようになります。

private DataContext db;
return cache.Get<List<SomeDBObject>>(
    () => db.SomeDBObjectCall(param1, param2, param3));

ご覧のとおり、キャッシュ キーとして使用できるデリゲート呼び出しの値を動的に決定できれば、非常に役立ちます。

4

1 に答える 1

1

したがって、基本的には、キャッシングのためにラップしたい未知の署名を持つメソッドがあります。その場合は、メモ化という手法を検討することをお勧めします

ウィキペディア のメモ化 コンピューティングでは、メモ化は、関数呼び出しで以前に処理された入力の結果の計算を繰り返さないようにすることで、主にコンピューター プログラムを高速化するために使用される最適化手法です。

C# でのこのような関数の例は、次のようなものです。

static Func<A, R> Memoize(this Func<A, R> f)
{
    var dict = new Dictionary<A, R>();
    return (A arg)=>
    {
        R result;
        if (!dict.TryGetValue(arg, out result))
        {
             result = f(arg);
             dict.Add(arg, result);
        }
        return result;
    };
}

このメソッドはジェネリック Func を受け取り、同じシグネチャを持つジェネリック Func を返すことに注意してください。このようにして、残りのコードを行き詰まらせることなく、効果的にメソッドをラップできます。本当にシームレスです!

その他の例ここここ

于 2012-07-17T16:15:44.057 に答える