예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
        }