diff --git a/BeefLibs/corlib/src/Reflection/FieldInfo.bf b/BeefLibs/corlib/src/Reflection/FieldInfo.bf index 76acb6c9..9120a7e7 100644 --- a/BeefLibs/corlib/src/Reflection/FieldInfo.bf +++ b/BeefLibs/corlib/src/Reflection/FieldInfo.bf @@ -150,7 +150,7 @@ namespace System.Reflection return &value;*/ if (type.IsBoxed) - return ((uint8*)(void*)value) + type.[Friend]mMemberDataOffset; + return ((uint8*)Internal.UnsafeCastToPtr(value)) + type.[Friend]mMemberDataOffset; return ((uint8*)Internal.UnsafeCastToPtr(value)); } diff --git a/BeefLibs/corlib/src/Type.bf b/BeefLibs/corlib/src/Type.bf index 2e0d21cc..e3ddd6b0 100644 --- a/BeefLibs/corlib/src/Type.bf +++ b/BeefLibs/corlib/src/Type.bf @@ -733,6 +733,12 @@ namespace System.Reflection public override bool IsSubtypeOf(Type checkBaseType) { TypeInstance curType = this; + if (curType.IsBoxed) + { + curType = curType.UnderlyingType as TypeInstance; + if (curType == null) + return false; + } while (true) { if (curType == checkBaseType) diff --git a/IDEHelper/Tests/src/Reflection.bf b/IDEHelper/Tests/src/Reflection.bf index dcb9f05f..432ed455 100644 --- a/IDEHelper/Tests/src/Reflection.bf +++ b/IDEHelper/Tests/src/Reflection.bf @@ -1,6 +1,7 @@ #pragma warning disable 168 using System; +using System.Reflection; namespace Tests { @@ -124,6 +125,13 @@ namespace Tests } } + [Reflect, AlwaysInclude(AssumeInstantiated=true, IncludeAllMethods=true)] + struct StructB + { + public int mA; + public String mB; + } + class ClassA2 : ClassA { public override int GetA(int32 a) @@ -470,5 +478,31 @@ namespace Tests methodIdx++; } } + + [Test] + static void TestStructB() + { + StructB sb; + sb.mA = 25; + sb.mB = "Struct B"; + + let type = sb.GetType() as TypeInstance; + let fields = type.GetFields(); + int fieldIdx = 0; + for (let field in fields) + { + let refP = field.GetValue(sb); + switch (fieldIdx) + { + case 0: + Test.Assert(refP.Value.Get() == 25); + case 1: + Test.Assert(refP.Value.Get() === "Struct B"); + case 2: + Test.FatalError(); + } + fieldIdx++; + } + } } }