コード例 #1
0
        private Converter <ByteString, object> GetReadMethod(PropertyInfo prop, EndianBitConverter bitConverter)
        {
            if (prop.CanRead == false)
            {
                return(null);
            }

            var hca = prop.GetCustomAttribute <HBaseConverterAttribute>();

            if (hca?.BinaryConverter != null)
            {
                var read = hca.BinaryConverter.GetMethod(nameof(IByteArrayConverter.Read));
                if (read == null)
                {
                    return(null);
                }
                var reader = Activator.CreateInstance(hca.BinaryConverter);
                return(b => read.Invoke(reader, new object[] { b.ToArray(), prop.PropertyType, hca.ConverterParameters }));
            }

            if (prop.PropertyType == typeof(string))
            {
                return(b => b.ToStringUtf8());
            }

            var propertyType = prop.PropertyType.Name == "Nullable`1" ? prop.PropertyType.GenericTypeArguments.FirstOrDefault() : prop.PropertyType;

            if (propertyType == null)
            {
                return(null);
            }

            var method = bitConverter.GetType().GetMethods().FirstOrDefault(t =>
                                                                            t.Name.StartsWith("To") &&
                                                                            t.ReturnParameter.ParameterType == propertyType);

            if (method == null)
            {
                return(null);
            }

            return(b => method.Invoke(bitConverter, new object[] { b.ToByteArray(), 0 }));
        }
コード例 #2
0
        private Converter <object, byte[]> GetWriteMethod(PropertyInfo prop, EndianBitConverter bitConverter)
        {
            if (prop.CanWrite == false)
            {
                return(null);
            }

            var hbca = prop.GetCustomAttribute <HBaseConverterAttribute>();

            if (hbca != null)
            {
                var writer = Activator.CreateInstance(hbca.BinaryConverter);
                var write  = hbca.BinaryConverter.GetMethod(nameof(IByteArrayConverter.Write));
                if (write == null)
                {
                    return(null);
                }
                return(v => write.Invoke(writer, new[] { v, hbca.ConverterParameters }) as byte[]);
            }

            if (prop.PropertyType == typeof(string))
            {
                return(v => v.ToString().ToUtf8Bytes());
            }

            var propertyType = prop.PropertyType.Name == "Nullable`1" ? prop.PropertyType.GenericTypeArguments.FirstOrDefault() : prop.PropertyType;

            if (propertyType == null)
            {
                return(null);
            }

            var method = bitConverter.GetType().GetMethods().FirstOrDefault(t =>
                                                                            t.Name == nameof(EndianBitConverter.GetBytes) &&
                                                                            t.GetParameters().FirstOrDefault()?.ParameterType == propertyType);

            if (method == null)
            {
                return(null);
            }

            return(v => method.Invoke(bitConverter, new[] { v }) as byte[]);
        }