using System; public struct MemoizedToString where TInput : IEquatable where TToString : struct, IToStringImplementation { private TInput lastInput; private string lastOutput; private TToString implementation; private static readonly MemoizedToString defaultValue; public string GetString(in TInput input) { if (!input.Equals(lastInput)) { lastInput = input; lastOutput = implementation.DoToString(in lastInput); } return lastOutput; } public static MemoizedToString GetNew() { return defaultValue; } static MemoizedToString() { TInput input = default(TInput); TToString val = default(TToString); defaultValue = new MemoizedToString { lastInput = input, lastOutput = val.DoToString(in input), implementation = val }; } }