コード例 #1
0
        private static VLTBaseType CloneObjectWithReflection(VLTBaseType originalValue, VLTBaseType newValue, VltClass vltClass, VltClassField vltClassField,
                                                             VltCollection vltCollection)
        {
            PropertyInfo[] properties = originalValue.GetType()
                                        .GetProperties(BindingFlags.Public | BindingFlags.Instance)
                                        .Where(p => p.SetMethod?.IsPublic ?? false)
                                        .ToArray();

            foreach (var propertyInfo in properties)
            {
                if (propertyInfo.PropertyType.IsSubclassOf(typeof(VLTBaseType)))
                {
                    propertyInfo.SetValue(newValue, CloneObjectWithReflection(
                                              propertyInfo.GetValue(originalValue) as VLTBaseType,
                                              Activator.CreateInstance(propertyInfo.PropertyType, vltClass, vltClassField, vltCollection) as
                                              VLTBaseType,
                                              vltClass, vltClassField, vltCollection));
                }
                else if (propertyInfo.PropertyType == typeof(string))
                {
                    propertyInfo.SetValue(newValue, new string(propertyInfo.GetValue(originalValue) as string));
                }
                else if (propertyInfo.PropertyType.IsPrimitive || propertyInfo.PropertyType.IsEnum)
                {
                    propertyInfo.SetValue(newValue, propertyInfo.GetValue(originalValue));
                }
                else if (propertyInfo.PropertyType.IsArray && propertyInfo.GetValue(originalValue) != null)
                {
                    propertyInfo.SetValue(newValue, ((Array)propertyInfo.GetValue(originalValue)).Clone());
                }
            }

            return(newValue);
        }
コード例 #2
0
 public EffectLinkageRecord(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection)
 {
 }
コード例 #3
0
 public JittererParams(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection)
 {
 }
コード例 #4
0
 public RoadblockElement(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection)
 {
 }
コード例 #5
0
 public SirenSequence(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection)
 {
 }
コード例 #6
0
 public GMapRegionInfo(VltClass @class, VltClassField field) : base(@class, field)
 {
 }
コード例 #7
0
 public CopCountRecord(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection)
 {
 }
コード例 #8
0
 public ControllerDataRecord(VltClass @class, VltClassField field) : base(@class, field)
 {
 }
コード例 #9
0
 public FXROADNOISE_TRANSITION(VltClass @class, VltClassField field) : base(@class, field)
 {
 }
コード例 #10
0
 public FECarPartInfo(VltClass @class, VltClassField field) : base(@class, field)
 {
 }
コード例 #11
0
 public ControllerDataRecord(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection)
 {
 }
コード例 #12
0
 public FECarPartInfo(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection)
 {
 }
コード例 #13
0
 public FEMsgToSoundTrigger(VltClass @class, VltClassField field) : base(@class, field)
 {
 }
コード例 #14
0
 public FEMsgToSoundTrigger(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection)
 {
 }
コード例 #15
0
 public BlackBoardSlot(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection)
 {
 }
コード例 #16
0
 public FXROADNOISE_TRANSITION(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection)
 {
 }
コード例 #17
0
 public BlackBoardSlot(VltClass @class, VltClassField field) : base(@class, field)
 {
 }
コード例 #18
0
 public TireTimeEffectRecord(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection)
 {
 }
コード例 #19
0
 public GMapRegionInfo(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection)
 {
 }
コード例 #20
0
 public TireTimeEffectRecord(VltClass @class, VltClassField field) : base(@class, field)
 {
 }
コード例 #21
0
 public CopCountRecord(VltClass @class, VltClassField field) : base(@class, field)
 {
 }
コード例 #22
0
 public RefSpec(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection)
 {
 }
コード例 #23
0
 public RoadblockElement(VltClass @class, VltClassField field) : base(@class, field)
 {
 }
コード例 #24
0
 public RefSpec(VltClass @class, VltClassField field) : base(@class, field)
 {
 }
コード例 #25
0
 public SirenSequence(VltClass @class, VltClassField field) : base(@class, field)
 {
 }
コード例 #26
0
 public ClassRefSpec_fe_flashers(VltClass @class, VltClassField field, VltCollection collection) : base(@class, field, collection, "fe_flashers")
 {
 }
コード例 #27
0
 public EffectLinkageRecord(VltClass @class, VltClassField field) : base(@class, field)
 {
 }
コード例 #28
0
 public ClassRefSpec_fe_flashers(VltClass @class, VltClassField field) : base(@class, field, "fe_flashers")
 {
 }
コード例 #29
0
 public JittererParams(VltClass @class, VltClassField field) : base(@class, field)
 {
 }
コード例 #30
0
        public static VLTBaseType CloneValue(Database database, VLTBaseType originalValue, VltClass vltClass, VltClassField vltClassField,
                                             VltCollection vltCollection)
        {
            var newValue = (originalValue is VLTArrayType)
                ? TypeRegistry.CreateInstance(database.Options.GameId, vltClass, vltClassField, vltCollection)
                : TypeRegistry.ConstructInstance(TypeRegistry.ResolveType(database.Options.GameId, vltClassField.TypeName), vltClass,
                                                 vltClassField, vltCollection);

            if (originalValue is VLTArrayType array)
            {
                var newArray = (VLTArrayType)newValue;
                newArray.Capacity      = array.Capacity;
                newArray.ItemAlignment = vltClassField.Alignment;
                newArray.FieldSize     = vltClassField.Size;
                newArray.Items         = array.Items.Select(i => CloneValue(database, i, vltClass, vltClassField, vltCollection)).ToList();

                return(newArray);
            }

            switch (originalValue)
            {
            case PrimitiveTypeBase primitiveTypeBase:
                var convertible = primitiveTypeBase.GetValue();
                if (convertible != null)
                {
                    ((PrimitiveTypeBase)newValue).SetValue(convertible);
                }
                return(newValue);

            default:
                return(CloneObjectWithReflection(originalValue, newValue, vltClass, vltClassField, vltCollection));
            }
        }