SHOW:
|
|
- or go back to the newest paste.
1 | class Program | |
2 | { | |
3 | // Can't do IDictionary<int, Func<T, String>> as T is not available here. | |
4 | private static readonly IDictionary<int, Object> _cache = new Dictionary<int, Object>(); | |
5 | ||
6 | public static void SomeToStringCalls() | |
7 | { | |
8 | Console.WriteLine(ToString(i => (i + 1).ToString(), 1)); | |
9 | Console.WriteLine(ToString(i => (i + 1).ToString(), 2)); | |
10 | Console.WriteLine(ToString(i => (i + 2).ToString(), 3)); | |
11 | Console.WriteLine(ToString(i => (i + 2).ToString(), 4)); | |
12 | } | |
13 | ||
14 | private static int GetExpressionHash<T>(Expression<Func<T, string>> expression) | |
15 | { | |
16 | int hash = expression.Body.ToString().GetHashCode(); | |
17 | // if you consider parameter unimportant - comment this line | |
18 | // using quite simple and error-prone hash function h = h * 31 + update | |
19 | // you might want to switch to md5 or sha in production | |
20 | expression.Parameters.ToList().ForEach(param => hash = hash * 31 + param.Name.GetHashCode()); | |
21 | return hash; | |
22 | } | |
23 | ||
24 | private static string ToString<T>(Expression<Func<T, string>> expression, T input) | |
25 | { | |
26 | var cacheKey = GetExpressionHash(expression); | |
27 | if (!_cache.ContainsKey(cacheKey)) | |
28 | { | |
29 | _cache[cacheKey] = expression.Compile(); | |
30 | Console.WriteLine(String.Format("Compiling expression {0}", expression.ToString())); | |
31 | } | |
32 | var method = (Func<T, string>) _cache[cacheKey]; | |
33 | return method.Invoke(input); | |
34 | } | |
35 | ||
36 | static void Main(string[] args) | |
37 | { | |
38 | SomeToStringCalls(); | |
39 | Console.ReadLine(); | |
40 | } | |
41 | } |