public static Func<object, object> CreateGet(FieldInfo field)
{
Func<object, object> lateBoundFieldGet;
if (!FieldInfoToLateBoundField.TryGetValue(field, out lateBoundFieldGet))
{
var instanceParameter = Expression.Parameter(typeof(object), "target");
var member = Expression.Field(Expression.Convert(instanceParameter, field.DeclaringType), field);
var lambda = Expression.Lambda<Func<object, object>>(
Expression.Convert(member, typeof(object)),
instanceParameter
);
lateBoundFieldGet = lambda.Compile();
FieldInfoToLateBoundField[field] = lateBoundFieldGet;
}
return lateBoundFieldGet;
}