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 })); }
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[]); }