private static Action <object, object> createSourceSetter(Type oneSideType, Type manySideType) { var valueSetMethod = manySideType.GetProperties() .Single(p => MultiReference.IsReal(p) && MultiReference.SourceType(p) == oneSideType) .SetMethod; return(TableInfo.BuildSetAccessor(valueSetMethod)); }
public void CreateReaders() { if (this.lines == null) { throw new InvalidOperationException(); } int i = 0; foreach (string[] lin in lines) { if (types[i] == typeof(object)) { continue; } defs.Add(types[i], lin[2]); string[] entries = lin[2].Split(','); var array = this[types[i]] = new FieldReader[entries.Length]; for (int k = 0; k < entries.Length; k++) { string[] parts = entries[k].Split(' '); if (parts[0].StartsWith("ref")) { var referencedType = types[Int32.Parse(parts[0].Remove(0, 3))]; if (referencedType == typeof(object)) { array[k] = new EmptyReader(sizeof(int)); } else { array[k] = new ForeignKeyReader(dbm, referencedType) { Name = parts[1] } }; } else if (parts[0].StartsWith("sub=")) { //array[k] = new MultiKeyReader(dbm, types[Int32.Parse(parts[0].Remove(0, 4))]); Type referencedType = types[Int32.Parse(parts[0].Remove(0, 4))]; if (referencedType == typeof(object)) { array[k] = new EmptyReader(2 * sizeof(int)); } else { array[k] = (FieldReader)Activator.CreateInstance(typeof(MultiKeyReader <>).MakeGenericType(referencedType), dbm); try { array[k].Name = types[i].GetProperties() .SingleOrDefault(p => MultiReference.IsReal(p) && MultiReference.SourceType(p) == array[k].Type).Name; } catch (Exception e) { array[k].Name = "unknown"; } } } else { array[k] = new ColumnReader(dbm, parts[0]) { Name = parts[1] }; } } i++; } this.lines = null; }