private object SetValues(Type arraytp, DataRow row) { object item = Activator.CreateInstance(arraytp); //メンバを取得する try { PropertyInfo[] props = arraytp.GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (PropertyInfo pi in props) { Type prptype; object col; prptype = pi.PropertyType; if (row.Table.Columns.Contains(pi.Name)) { if (row.IsNull(pi.Name)) { col = null; } else { col = row[pi.Name]; } pi.SetValue(item, col); } } } catch (Exception ex) { FWThreadCoreDataException newex = new FWThreadCoreDataException(ConstDataAccess.Error, ex); throw newex; } return(item); }
private object ConvertFromDataTable(Type ptype, object param) { try { if (param == null) { return(param); } if ((param is DataRow) != true && (param is DataTable) != true) { return(param); } if (ptype.IsArray) { // 単純配列型(XXX[])の場合 List <object> data = new List <object>(); if (param is DataRow) { if ((param as DataRow).RowState != DataRowState.Deleted) { data.Add(SetValues(ptype, param as DataRow)); } } else if (param is DataTable) { foreach (DataRow row in (param as DataTable).Rows) { if (row.RowState != DataRowState.Deleted) { data.Add(SetValues(ptype.GetProperty("Item").PropertyType, row)); } } } return(data.ToArray()); } else { if (ptype.IsGenericType && typeof(List <>).IsAssignableFrom(ptype.GetGenericTypeDefinition())) { object dat = Activator.CreateInstance(ptype); MethodInfo mAdd = dat.GetType().GetMethod("Add"); // ジェネリックコレクション List<XXX>の場合 if (param is DataRow) { if ((param as DataRow).RowState != DataRowState.Deleted) { mAdd.Invoke(dat, new object[] { SetValues(ptype.GetProperty("Item").PropertyType, param as DataRow) }); } } else if (param is DataTable) { foreach (DataRow row in (param as DataTable).Rows) { if (row.RowState != DataRowState.Deleted) { //dat.Add(SetValues(ptype.GetProperty("Item").PropertyType, row)); mAdd.Invoke(dat, new object[] { SetValues(ptype.GetProperty("Item").PropertyType, row) }); } } } return(dat); } else { if (param is DataRow) { if ((param as DataRow).RowState != DataRowState.Deleted) { return(SetValues(ptype, (param as DataRow))); } else { return(null); } } else if (param is DataTable) { if ((param as DataTable).Rows.Count > 0) { if ((param as DataTable).Rows[0].RowState != DataRowState.Deleted) { // 配列ではないので、Rowsの1件目のみを非コレクション型として渡す return(SetValues(ptype, (param as DataTable).Rows[0])); } else { return(null); } } else { return(null); } } else { return(param); } } } } catch (Exception ex) { FWThreadCoreDataException newex = new FWThreadCoreDataException(ConstDataAccess.Error, ex); throw newex; } }