Ejemplo n.º 1
0
        public static T RecurviseResetToDefaults <T>(T value)
        {
            var type = value.GetType();

            foreach (var m in RTLReflectionTools.SynthesizableMembers(type))
            {
                var memberType   = m.GetMemberType();
                var memberValue  = m.GetValue(value);
                var backingField = getBackingField(value, m);

                if (memberValue is RTLBitArray bitArray)
                {
                    backingField.SetValue(value, new RTLBitArray().Resized(bitArray.Size).TypeChanged(bitArray.DataType));
                    continue;
                }

                if (RTLModuleHelper.IsSynthesizableSignalType(memberType))
                {
                    if (RTLReflectionTools.TryGetNullableType(memberType, out var actualType))
                    {
                        backingField.SetValue(value, Activator.CreateInstance(actualType));
                    }
                    else
                    {
                        backingField.SetValue(value, Activator.CreateInstance(memberType));
                    }
                    continue;
                }

                if (RTLModuleHelper.IsSynthesizableObject(memberType))
                {
                    RecurviseResetToDefaults(memberValue);
                    continue;
                }

                if (RTLModuleHelper.IsSynthesizableArrayType(memberType))
                {
                    var emptyArray = Array.CreateInstance(memberType.GetElementType(), (memberValue as Array).Length);
                    backingField.SetValue(value, emptyArray);
                    continue;
                }
            }

            return(value);
        }