Kaynağa Gözat

GetValueReference<T>

Brian Fiete 8 ay önce
ebeveyn
işleme
3bafa11da9
1 değiştirilmiş dosya ile 82 ekleme ve 0 silme
  1. 82 0
      BeefLibs/corlib/src/Reflection/FieldInfo.bf

+ 82 - 0
BeefLibs/corlib/src/Reflection/FieldInfo.bf

@@ -454,6 +454,38 @@ namespace System.Reflection
 			return value;
 			return value;
 		}
 		}
 
 
+		public Result<T*> GetValueReference<T>(void* startTargetDataAddr, Type tTarget)
+		{
+			void* targetDataAddr = startTargetDataAddr;
+			if (targetDataAddr == null)
+			{
+				if (mFieldData.mFlags.HasFlag(FieldFlags.Const))
+				{
+					return (T*)&mFieldData.mData;
+				}
+
+				if (!mFieldData.mFlags.HasFlag(FieldFlags.Static))
+					return .Err;
+
+				targetDataAddr = null;
+			}
+			else
+			{
+				if (!tTarget.IsSubtypeOf(mTypeInstance))
+				    return .Err; //Invalid type;
+			}
+
+			targetDataAddr = (uint8*)targetDataAddr + (int)mFieldData.mData;
+
+			Type fieldType = Type.[Friend]GetType(mFieldData.mFieldTypeId);
+
+			TypeCode typeCode = fieldType.[Friend]mTypeCode;
+			if (typeCode == TypeCode.Enum)
+				typeCode = fieldType.UnderlyingType.[Friend]mTypeCode;
+
+			return (T*)targetDataAddr;
+		}
+
 		public Result<Variant> GetValue(Object target)
 		public Result<Variant> GetValue(Object target)
 		{
 		{
 			void* targetDataAddr;
 			void* targetDataAddr;
@@ -498,6 +530,32 @@ namespace System.Reflection
 			}
 			}
 		}
 		}
 
 
+		public Result<T*> GetValueReference<T>(Object target)
+		{
+			if (FieldType != typeof(T))
+				return .Err;
+
+			void* targetDataAddr;
+			if (target == null)
+			{
+				if (mFieldData.mFlags.HasFlag(FieldFlags.Const))
+				{
+					return (T*)&mFieldData.mData;
+				}
+
+				if (!mFieldData.mFlags.HasFlag(FieldFlags.Static))
+					return .Err;
+
+				return GetValueReference<T>(null, null);
+			}
+			else
+			{
+				Type tTarget;
+				targetDataAddr = GetDataPtrAndType(target, out tTarget);
+				return GetValueReference<T>(targetDataAddr, tTarget);
+			}
+		}
+
 		public Result<Variant> GetValueReference(Object target)
 		public Result<Variant> GetValueReference(Object target)
 		{
 		{
 			void* targetDataAddr;
 			void* targetDataAddr;
@@ -542,6 +600,30 @@ namespace System.Reflection
 			}
 			}
 		}
 		}
 
 
+		public Result<T*> GetValueReference<T>(Variant target)
+		{
+			if (FieldType != typeof(T))
+				return .Err;
+
+			if (!target.HasValue)
+			{
+				if (mFieldData.mFlags.HasFlag(FieldFlags.Const))
+				{
+					return (T*)&mFieldData.mData;
+				}
+
+				if (!mFieldData.mFlags.HasFlag(FieldFlags.Static))
+					return .Err;
+
+				return GetValueReference<T>(null, null);
+			}
+			else
+			{
+				var target;
+				return GetValueReference<T>(target.DataPtr, target.VariantType);
+			}
+		}
+
 	    public struct Enumerator : IEnumerator<FieldInfo>
 	    public struct Enumerator : IEnumerator<FieldInfo>
 	    {
 	    {
 			BindingFlags mBindingFlags;
 			BindingFlags mBindingFlags;