public static async Task <object> EvalMemberPath( BoundMemberInfo bound_member_info, object[] args, bool set_value, TypeConverter argument_converter) { var member_target = bound_member_info.Target; var member_info = bound_member_info.MemberInfo; switch (member_info.MemberType) { case MemberTypes.Field: if (set_value) { ((FieldInfo)member_info).SetValue(member_target, args[0]); } else { return(((FieldInfo)member_info).GetValue(member_target)); } break; case MemberTypes.Property: if (set_value) { ((PropertyInfo)member_info).SetValue(member_target, args[0]); } else { return(((PropertyInfo)member_info).GetValue(member_target)); } break; default: case MemberTypes.Method: var method_info = ((MethodInfo)member_info); var parameters = method_info.GetParameters(); var args_converted = parameters .Zip(args, (p, a) => new { p, a }) .Select(e => argument_converter.ConvertTo(e.a, e.p.ParameterType)) .ToArray(); var result = method_info.Invoke(member_target, args_converted); if (result is Task) { return(await(dynamic) result); } return(result); } return(args[0]); }
protected override bool TryGet <T>(BoundMemberInfo memberInfo, IDictionary <string, object> source, out T value) { if (!source.TryGetValue(memberInfo.Name, out var objectValue)) { value = default; return(false); } if (typeof(T) == objectValue.GetType()) { value = (T)objectValue; return(true); } value = default; return(false); }
protected override bool TryGet <T>(BoundMemberInfo memberInfo, LogsQueryResultRow source, out T value) { int column; // Binding entire row to a primitive if (memberInfo == null) { column = 0; } else if (!source.TryGetColumn(memberInfo.Name, out column)) { value = default; return(false); } if (source.IsNull(column) && (!typeof(T).IsValueType || typeof(T).IsGenericType && typeof(T).GetGenericTypeDefinition() == typeof(Nullable <>))) { value = default; return(true); } if (typeof(T) == typeof(int)) { value = (T)(object)source.GetInt32(column); } else if (typeof(T) == typeof(string)) { value = (T)(object)source.GetString(column); } else if (typeof(T) == typeof(bool)) { value = (T)(object)source.GetBoolean(column); } else if (typeof(T) == typeof(long)) { value = (T)(object)source.GetInt64(column); } else if (typeof(T) == typeof(decimal)) { value = (T)(object)source.GetDecimal(column); } else if (typeof(T) == typeof(double)) { value = (T)(object)source.GetDouble(column); } else if (typeof(T) == typeof(object)) { value = (T)source.GetObject(column); } else if (typeof(T) == typeof(Guid)) { value = (T)(object)source.GetGuid(column); } else if (typeof(T) == typeof(DateTimeOffset)) { value = (T)(object)source.GetDateTimeOffset(column); } else if (typeof(T) == typeof(TimeSpan)) { value = (T)(object)source.GetTimeSpan(column); } else if (typeof(T) == typeof(int?)) { value = (T)(object)(int?)source.GetInt32(column); } else if (typeof(T) == typeof(bool?)) { value = (T)(object)(bool?)source.GetBoolean(column); } else if (typeof(T) == typeof(long?)) { value = (T)(object)(long?)source.GetInt64(column); } else if (typeof(T) == typeof(decimal?)) { value = (T)(object)(decimal?)source.GetDecimal(column); } else if (typeof(T) == typeof(double?)) { value = (T)(object)(double?)source.GetDouble(column); } else if (typeof(T) == typeof(Guid?)) { value = (T)(object)(Guid?)source.GetGuid(column); } else if (typeof(T) == typeof(DateTimeOffset?)) { value = (T)(object)(DateTimeOffset?)source.GetDateTimeOffset(column); } else if (typeof(T) == typeof(TimeSpan?)) { value = (T)(object)(TimeSpan?)source.GetTimeSpan(column); } else { throw new NotSupportedException($"The {typeof(T)} type is not supported as a deserialization target."); } return(true); }
protected override void Set <T>(LogsQueryResultRow destination, T value, BoundMemberInfo memberInfo) { throw new NotSupportedException(); }
protected override void Set <T>(IDictionary <string, object> destination, T value, BoundMemberInfo memberInfo) { destination[memberInfo.Name] = value; }