private MethodInfo GetValueReadMethod(int index) { BindingColumnInfo bindingInfo = new BindingColumnInfo() { Metadata = this.attributes[index].GetMetadata <IBindingMetadata>(), Column = this.columns[index], }; MethodInfo readMethod = bindingInfo.Metadata?.Value?.Read?.Invoke(bindingInfo); if (readMethod == null) { readMethod = typeof(IDataRecord).GetMethod(nameof(IDataRecord.GetValue), new Type[] { typeof(int) }); } return(readMethod); }
private MethodInfo GetValueReaderMethod(IBindingMetadata metadata, ColumnMetadata columnInfo) { BindingColumnInfo bindingInfo = new BindingColumnInfo() { Metadata = metadata, Column = columnInfo, }; MethodInfo readMethod = metadata.Value?.Read?.Invoke(bindingInfo); if (readMethod == null) { readMethod = typeof(IDataRecord).GetMethod(nameof(IDataRecord.GetValue), new Type[] { typeof(int) }); } return(readMethod); }
private static Action <IField, object> BuildFieldBinder(MetadataIdentity metadata, ColumnIdentity column) { ParameterExpression fieldParam = Expression.Parameter(typeof(IField)); ParameterExpression valueParam = Expression.Parameter(typeof(object)); IBindingMetadata binding = metadata.GetMetadata <IBindingMetadata>(); Expression bindValue = valueParam; if (metadata != null) { Type sourceType = null; if (column != null) { BindingColumnInfo columnInfo = new BindingColumnInfo() { Column = column, CanBeNull = true, Metadata = binding, }; sourceType = binding.Value?.Read(columnInfo)?.ReturnType; } BindingValueInfo valueInfo = new BindingValueInfo() { CanBeNull = true, CanBeDbNull = true, Metadata = binding, Value = bindValue, SourceType = sourceType, TargetType = binding.Type, }; bindValue = binding.Value?.Convert?.Invoke(valueInfo) ?? valueParam; } MethodInfo bindMethod = typeof(IField).GetMethod(nameof(IField.Bind), new[] { typeof(object) }); Expression bindCall = Expression.Call(fieldParam, bindMethod, Expression.Convert(bindValue, typeof(object))); return(Expression.Lambda <Action <IField, object> >(bindCall, fieldParam, valueParam).Compile()); }
public BufferConverter Compile(MetadataIdentity metadata, ColumnMetadata columnInfo) { IBindingMetadata binding = metadata.Lookup <IBindingMetadata>(); ParameterExpression inputParam = Expression.Parameter(typeof(object)); ParameterExpression helperParam = Expression.Parameter(typeof(object)); ParameterExpression helperVariable = this.GetHelperVariable(binding); Expression value = inputParam; if (binding != null) { Type sourceType = null; if (columnInfo != null) { BindingColumnInfo bindingColumnInfo = new BindingColumnInfo() { Column = columnInfo, CanBeNull = true, Metadata = binding, }; sourceType = binding.Value?.Read(bindingColumnInfo)?.ReturnType; } BindingValueInfo valueInfo = new BindingValueInfo() { CanBeNull = true, CanBeDbNull = true, Metadata = binding, Value = value, SourceType = sourceType, TargetType = binding.Type, Helper = helperVariable, }; try { value = binding.Value?.Convert?.Invoke(valueInfo) ?? inputParam; } catch (BindingException) { throw; } catch (Exception ex) { throw BindingException.InvalidCast(binding, ex); } } value = this.GetObjectExpression(value); if (helperVariable != null) { Expression typedParam = Expression.Convert(helperParam, helperVariable.Type); Expression assignHelper = Expression.Assign(helperVariable, typedParam); value = Expression.Block(new[] { helperVariable }, assignHelper, value); } BufferInternalConverter innerFunc = Expression.Lambda <BufferInternalConverter>(value, inputParam, helperParam).Compile(); object helperObject = binding?.Helper?.Object; return(value => innerFunc(value, helperObject)); }