コード例 #1
0
        private static bool FindFieldInfo(IntPtr typeClass, IntPtr unrealStruct, string fieldName, out CachedFieldInfo fieldInfo)
        {
            if (typeClass == IntPtr.Zero || unrealStruct == IntPtr.Zero || string.IsNullOrEmpty(fieldName))
            {
                fieldInfo = default(CachedFieldInfo);
                return(false);
            }

            if (unrealStruct == lastUnrealStruct)
            {
                return(lastUnrealStructChildren.TryGetValue(fieldName, out fieldInfo));
            }
            else if (unrealStruct == lastUnrealFunction)
            {
                return(lastUnrealFunctionChildren.TryGetValue(fieldName, out fieldInfo));
            }
            else
            {
                Dictionary <string, CachedFieldInfo> fields = null;

                if (Native_UObjectBaseUtility.IsA(unrealStruct, Classes.UFunction))
                {
                    fields             = lastUnrealFunctionChildren;
                    lastUnrealFunction = unrealStruct;
                }
                else
                {
                    fields           = lastUnrealStructChildren;
                    lastUnrealStruct = unrealStruct;
                }

                fields.Clear();

                foreach (IntPtr field in new NativeReflection.NativeFieldIterator(EClassCastFlags.UFunction | EClassCastFlags.UProperty, unrealStruct, false))
                {
                    Native_UObjectBaseUtility.GetNameOut(field, ref nameUnsafe.Array);
                    string name = nameUnsafe.Value;

                    fields[name] = new CachedFieldInfo()
                    {
                        Address = field,
                        Offset  = Native_UProperty.GetOffset_ForInternal(field)
                    };
                }

                return(fields.TryGetValue(fieldName, out fieldInfo));
            }
        }
コード例 #2
0
ファイル: UProperty.cs プロジェクト: yimengfan/USharp
 /// <summary>
 /// Return offset of property from container base.
 /// </summary>
 public int GetOffset_ForInternal()
 {
     return(Native_UProperty.GetOffset_ForInternal(Address));
 }
コード例 #3
0
        private static bool FindFieldInfo(IntPtr typeClass, IntPtr unrealStruct, string fieldName, out CachedFieldInfo fieldInfo)
        {
            if (typeClass == IntPtr.Zero || unrealStruct == IntPtr.Zero || string.IsNullOrEmpty(fieldName))
            {
                fieldInfo = default(CachedFieldInfo);
                return(false);
            }

            if (unrealStruct == lastUnrealStruct)
            {
                return(lastUnrealStructChildren.TryGetValue(fieldName, out fieldInfo));
            }
            else if (unrealStruct == lastUnrealFunction)
            {
                return(lastUnrealFunctionChildren.TryGetValue(fieldName, out fieldInfo));
            }
            else
            {
                Dictionary <string, CachedFieldInfo> fields = null;

                // For structs we want to get all fields in the hierarchy as we can't struct inheritance in C#
                // (C++ structs can have inheritance, if we skip checking the hierarchy we wont get all the fields we want)
                bool isScriptStruct = false;

                if (Native_UObjectBaseUtility.IsA(unrealStruct, Classes.UFunction))
                {
                    fields             = lastUnrealFunctionChildren;
                    lastUnrealFunction = unrealStruct;
                }
                else
                {
                    isScriptStruct   = Native_UObjectBaseUtility.IsA(unrealStruct, Classes.UScriptStruct);
                    fields           = lastUnrealStructChildren;
                    lastUnrealStruct = unrealStruct;
                }

                fields.Clear();



                foreach (IntPtr field in new NativeReflection.NativeFieldIterator(
                             EClassCastFlags.UFunction | EClassCastFlags.UProperty, unrealStruct, false, isScriptStruct))
                {
                    Native_UObjectBaseUtility.GetNameOut(field, ref nameUnsafe.Array);
                    string name = nameUnsafe.Value;

                    // Temporary check for debugging purposes. There shouldn't be any duplicate fields as we aren't looking in the hierarchy.
                    if (System.Diagnostics.Debugger.IsAttached)
                    {
                        System.Diagnostics.Debug.Assert(!fields.ContainsKey(name));
                    }

                    fields[name] = new CachedFieldInfo()
                    {
                        Address = field,
                        Offset  = Native_UProperty.GetOffset_ForInternal(field)
                    };
                }

                return(fields.TryGetValue(fieldName, out fieldInfo));
            }
        }