|  | @@ -1,6 +1,7 @@
 | 
	
		
			
				|  |  |  using System;
 | 
	
		
			
				|  |  |  using System.Collections.Generic;
 | 
	
		
			
				|  |  |  using System.Linq;
 | 
	
		
			
				|  |  | +using System.Linq.Expressions;
 | 
	
		
			
				|  |  |  using System.Text;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  namespace Google.Protobuf
 | 
	
	
		
			
				|  | @@ -10,6 +11,8 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |          // TODO(jonskeet): For snmall enums, use something lighter-weight than a dictionary?
 | 
	
		
			
				|  |  |          private static readonly Dictionary<int, T> _byNumber;
 | 
	
		
			
				|  |  |          private static readonly Dictionary<string, T> _byName;
 | 
	
		
			
				|  |  | +        private static readonly Func<T, long> toRawValue;
 | 
	
		
			
				|  |  | +        private static readonly Func<long, T> fromRawValue;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          private const long UnknownValueBase = 0x100000000L;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -36,6 +39,13 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  _byName[name] = (T) Enum.Parse(typeof(T), name, false);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            ParameterExpression param1 = Expression.Parameter(typeof(T), "x");
 | 
	
		
			
				|  |  | +            ParameterExpression param2 = Expression.Parameter(typeof(long), "x");
 | 
	
		
			
				|  |  | +            Expression convertedParam1 = Expression.Convert(param1, typeof(long));
 | 
	
		
			
				|  |  | +            Expression convertedParam2 = Expression.Convert(param2, typeof(T));
 | 
	
		
			
				|  |  | +            toRawValue = Expression.Lambda<Func<T, long>>(convertedParam1, param1).Compile();
 | 
	
		
			
				|  |  | +            fromRawValue = Expression.Lambda<Func<long, T>>(convertedParam2, param2).Compile();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
	
		
			
				|  | @@ -71,14 +81,12 @@ namespace Google.Protobuf
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          private static long GetRawValue(T value)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            // TODO(jonskeet): Try using expression trees to get rid of the boxing here.
 | 
	
		
			
				|  |  | -            return (long)(object)value;
 | 
	
		
			
				|  |  | +            return toRawValue(value);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          private static T FromRawValue(long value)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            // TODO(jonskeet): Try using expression trees to get rid of the boxing here.
 | 
	
		
			
				|  |  | -            return (T)(object)value;
 | 
	
		
			
				|  |  | +            return fromRawValue(value);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      }
 |