private TypedCursorable(IHostEnvironment env, IDataView data, bool ignoreMissingColumns, InternalSchemaDefinition schemaDefn) { Contracts.AssertValue(env, "env"); _host = env.Register("TypedCursorable"); _host.AssertValue(data); _host.AssertValue(schemaDefn); _data = data; // Get column indices. Throw if there are missing columns (optionally, ignore them). var acceptedCols = new List <InternalSchemaDefinition.Column>(); var indices = new List <int>(); foreach (var col in schemaDefn.Columns) { int colIndex; if (!_data.Schema.TryGetColumnIndex(col.ColumnName, out colIndex)) { if (ignoreMissingColumns) { continue; } throw _host.Except("Column '{0}' not found in the data view", col.ColumnName); } var realColType = _data.Schema[colIndex].Type; if (!IsCompatibleType(realColType, col.MemberInfo)) { throw _host.Except( "Can't bind the IDataView column '{0}' of type '{1}' to field or property '{2}' of type '{3}'.", col.ColumnName, realColType, col.MemberInfo.Name, col.FieldOrPropertyType.FullName); } acceptedCols.Add(col); indices.Add(colIndex); } _columns = acceptedCols.ToArray(); _columnIndices = indices.ToArray(); _host.Assert(_columns.Length == _columnIndices.Length); int n = _columns.Length; _pokes = new Delegate[n]; _peeks = new Delegate[n]; var schema = _data.Schema; for (int i = 0; i < n; i++) { if (_columns[i].ColumnType.IsVector) { _peeks[i] = ApiUtils.GeneratePeek <TypedCursorable <TRow>, TRow>(_columns[i]); } _pokes[i] = ApiUtils.GeneratePoke <TypedCursorable <TRow>, TRow>(_columns[i]); } }