public void Can_use_TypedFields_accessor()
        {
            var runtimeType = typeof(MyType);
            var typeProps   = TypeFields.Get(runtimeType); //Equivalent to:
            //  typeProps = TypeFields<MyType>.Instance;

            var instance = runtimeType.CreateInstance();

            var propAccessor = typeProps.GetAccessor("LongField");

            propAccessor.PublicSetter(instance, 1L);
            Assert.That(propAccessor.PublicGetter(instance), Is.EqualTo(1));

            typeProps.GetPublicSetter("StringField")(instance, "foo");
            var value = typeProps.GetPublicGetter("StringField")(instance);

            Assert.That(value, Is.EqualTo("foo"));
        }
Beispiel #2
0
        private static object PropValue(object targetValue, Type targetType, string name)
        {
            var memberFn = TypeProperties.Get(targetType).GetPublicGetter(name)
                           ?? TypeFields.Get(targetType).GetPublicGetter(name);

            if (memberFn != null)
            {
                return(memberFn(targetValue));
            }

            var indexerMethod = targetType.GetInstanceMethod("get_Item");

            if (indexerMethod != null)
            {
                var fn  = indexerMethod.GetInvoker();
                var ret = fn(targetValue, name);
                return(ret ?? JsNull.Value);
            }

            throw new ArgumentException($"'{targetType.Name}' does not have a '{name}' property or field");
        }
Beispiel #3
0
        public static T ConvertToValueTuple <T>(this IDataReader reader, object[] values, IOrmLiteDialectProvider dialectProvider)
        {
            var row        = typeof(T).CreateInstance();
            var typeFields = TypeFields.Get(typeof(T));

            values = reader.PopulateValues(values, dialectProvider);

            for (var i = 0; i < reader.FieldCount; i++)
            {
                var itemName = $"Item{(i + 1)}";
                var field    = typeFields.GetAccessor(itemName);
                if (field == null)
                {
                    break;
                }

                var dbValue = values != null
                    ? values[i]
                    : reader.GetValue(i);

                if (dbValue == null)
                {
                    continue;
                }

                var fieldType = field.FieldInfo.FieldType;
                if (dbValue.GetType() == fieldType)
                {
                    field.PublicSetterRef(ref row, dbValue);
                }
                else
                {
                    var converter  = dialectProvider.GetConverter(fieldType);
                    var fieldValue = converter.FromDbValue(fieldType, dbValue);
                    field.PublicSetterRef(ref row, fieldValue);
                }
            }

            return((T)row);
        }
Beispiel #4
0
        private static object PropValue(object targetValue, Type targetType, string name)
        {
            var memberFn = TypeProperties.Get(targetType).GetPublicGetter(name)
                           ?? TypeFields.Get(targetType).GetPublicGetter(name);

            if (memberFn != null)
            {
                return(memberFn(targetValue));
            }

            var methods       = targetType.GetInstanceMethods();
            var indexerMethod =
                methods.FirstOrDefault(x => x.Name == "get_Item" && x.GetParameters().Any(p => p.ParameterType == typeof(string))) ??
                methods.FirstOrDefault(x => x.Name == "get_Item" && x.GetParameters().Any(p => p.ParameterType != typeof(string)));

            if (indexerMethod != null)
            {
                var fn  = indexerMethod.GetInvoker();
                var ret = fn(targetValue, name);
                return(ret);
            }

            throw new ArgumentException($"'{targetType.Name}' does not have a '{name}' property or field");
        }
        private object GetValue(object targetValue, TemplateScopeContext scope)
        {
            if (targetValue == null || targetValue == JsNull.Value)
            {
                return(JsNull.Value);
            }
            var targetType = targetValue.GetType();

            try
            {
                object propValue(string name)
                {
                    var memberFn = TypeProperties.Get(targetType).GetPublicGetter(name)
                                   ?? TypeFields.Get(targetType).GetPublicGetter(name);

                    if (memberFn != null)
                    {
                        return(memberFn(targetValue));
                    }

                    var indexerMethod = targetType.GetInstanceMethod("get_Item");

                    if (indexerMethod != null)
                    {
                        var fn  = indexerMethod.GetInvoker();
                        var ret = fn(targetValue, name);
                        return(ret ?? JsNull.Value);
                    }

                    throw new ArgumentException($"'{targetType.Name}' does not have a '{name}' property or field");
                }

                if (!Computed)
                {
                    if (Property is JsIdentifier identifier)
                    {
                        var ret = propValue(identifier.NameString);

                        // Don't emit member expression on null KeyValuePair
                        if (ret == null && targetType.Name == "KeyValuePair`2")
                        {
                            return(JsNull.Value);
                        }

                        return(ret);
                    }
                }
                else
                {
                    var indexValue = Property.Evaluate(scope);
                    if (indexValue == null)
                    {
                        return(JsNull.Value);
                    }

                    if (targetType.IsArray)
                    {
                        var array = (Array)targetValue;
                        if (indexValue is long l)
                        {
                            return(array.GetValue(l));
                        }
                        var intValue = indexValue.ConvertTo <int>();
                        return(array.GetValue(intValue));
                    }
                    if (targetValue is IDictionary dict)
                    {
                        var ret = dict[indexValue];
                        return(ret ?? JsNull.Value);
                    }
                    if (indexValue is string propName)
                    {
                        return(propValue(propName));
                    }
                    if (targetValue is IList list)
                    {
                        var intValue = indexValue.ConvertTo <int>();
                        return(list[intValue]);
                    }
                    if (targetValue is IEnumerable e)
                    {
                        var intValue = indexValue.ConvertTo <int>();
                        var i        = 0;
                        foreach (var item in e)
                        {
                            if (i++ == intValue)
                            {
                                return(item);
                            }
                        }
                        return(null);
                    }
                    if (DynamicNumber.IsNumber(indexValue.GetType()))
                    {
                        var indexerMethod = targetType.GetInstanceMethod("get_Item");
                        if (indexerMethod != null)
                        {
                            var fn  = indexerMethod.GetInvoker();
                            var ret = fn(targetValue, indexValue);
                            return(ret ?? JsNull.Value);
                        }
                    }
                }
            }
            catch (KeyNotFoundException)
            {
                return(JsNull.Value);
            }
            catch (Exception ex)
            {
                var exResult = scope.PageResult.Format.OnExpressionException(scope.PageResult, ex);
                if (exResult != null)
                {
                    return(exResult);
                }

                var expr = ToRawString();
                throw new BindingExpressionException($"Could not evaluate expression '{expr}'", null, expr, ex);
            }

            throw new NotSupportedException($"'{targetValue.GetType()}' does not support access by '{Property}'");
        }