public object SearchScalar(string query) { string typeName, primaryKeyName, primaryKeyStrValue; if (_query_process(query, out typeName, out primaryKeyName, out primaryKeyStrValue)) { Type t = _get_type_by_name(typeName); ClassInfo schemeInfo = m_catalogTree.Search(t.FullName); if (schemeInfo != null) { object keyValue = Types.GetValue(primaryKeyStrValue, Types.GetInternalType(Types.GetClassFieldType(t, primaryKeyName))); OOD.Imp.Storage.ObjectTree ot = _get_object_tree(schemeInfo.TopNodeSId); ObjectInfo oInfo = ot.SearchObject(keyValue); if (oInfo != null) { object result = _get_object_from_storage(oInfo, primaryKeyName, t, schemeInfo); return(result); } else { return(null); } } else { return(null); } } else { return(null); } }
public object _get_object_from_storage(ObjectInfo back, string primaryKeyName, Type tp, ClassInfo cinfo) { object result = tp.InvokeMember(null, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null); //put the primary key back tp.InvokeMember( primaryKeyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.SetField | BindingFlags.Instance, null, result, new object[] { back.PrimaryKeyValue }); //put other fields back for (int i = 0; i < cinfo.FieldNames.Length; i++) { FieldInfo field = tp.GetField(cinfo.FieldNames[i], BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); tp.InvokeMember( cinfo.FieldNames[i], BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.SetField | BindingFlags.Instance, null, result, new object[] { Types.GetValue(back.SerializedOtherFieldValues[i], Types.GetInternalType(field.FieldType)) }); } return(result); }