Exemple #1
0
        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;
 }