public TMember GetFieldValue <TInstance, TMember>(MemberInfo memberInfo, TInstance instance)
        {
            var info = memberInfo as FieldInfo;

            if (info != null)
            {
                var fieldInfo = info;
                Func <object, object> getter;
                if (!_getterCache.TryGetValue(fieldInfo.FieldHandle.Value, out getter))
                {
                    _getterCache[fieldInfo.FieldHandle.Value] = EmitHelper.CreateFieldGetterHandler(fieldInfo);
                }
                return((TMember)getter(instance));
            }
            else
            {
                throw new NotImplementedException();
            }
        }
        public TMember GetPropertyValue <TInstance, TMember>(PropertyInfo propertyInfo, TInstance instance)
        {
            if (propertyInfo != null)
            {
                var key = propertyInfo.GetGetMethod().MethodHandle.Value;
                Func <object, object> getter;
                if (!_getterCache.TryGetValue(key, out getter))
                {
                    getter            = EmitHelper.CreatePropertyGetterHandler(propertyInfo);
                    _getterCache[key] = getter;
                }

                if (getter == null)
                {
                    return(default(TMember));
                }
                return((TMember)getter(instance));
            }
            throw new NotImplementedException();
        }