/// <summary> /// Memoizer with one parameter (kept as weak reference), used to perform a lazy-cached evaluation. (see http://en.wikipedia.org/wiki/Memoization) /// </summary> /// <typeparam name="TParam">The return type to memoize</typeparam> /// <param name="func">the function to evaluate</param> /// <returns>A memoized value</returns> public static Func <TParam, TResult> AsWeakLockedMemoized <TParam, TResult>(this Func <TParam, TResult> func) where TParam : class { var values = new WeakAttachedDictionary <TParam, string>(); return(v => values.GetValue(v, "value", () => func(v))); }