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")); }
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"); }
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); }
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}'"); }