Remove Reflection from DatItem<T>

This commit is contained in:
Matt Nadareski
2026-03-26 23:46:20 -04:00
parent a7a622e118
commit 9929199f31
40 changed files with 230 additions and 21 deletions

View File

@@ -28,6 +28,12 @@ namespace SabreTools.Metadata.DatItems.Test
public TestDatItem(string? nameKey) => _nameKey = nameKey;
/// <inheritdoc/>
public override object Clone() => new TestDatItem()
{
_internal = _internal.Clone() as TestDatItemModel ?? []
};
/// <inheritdoc/>
public override string? GetName() => _nameKey is not null ? _internal.ReadString(_nameKey) : null;

View File

@@ -1,12 +1,11 @@
using System;
using System.Reflection;
namespace SabreTools.Metadata.DatItems
{
/// <summary>
/// Base class for all items included in a set that are backed by an internal model
/// </summary>
public abstract class DatItem<T> : DatItem, IEquatable<DatItem<T>>, IComparable<DatItem<T>>, ICloneable where T : Data.Models.Metadata.DatItem
public abstract class DatItem<T> : DatItem, IEquatable<DatItem<T>>, IComparable<DatItem<T>>, ICloneable where T : Data.Models.Metadata.DatItem, new()
{
#region Constructors
@@ -15,7 +14,7 @@ namespace SabreTools.Metadata.DatItems
/// </summary>
public DatItem()
{
_internal = Activator.CreateInstance<T>();
_internal = new T();
SetName(string.Empty);
Write(Data.Models.Metadata.DatItem.TypeKey, ItemType);
@@ -37,24 +36,6 @@ namespace SabreTools.Metadata.DatItems
#region Cloning Methods
/// <summary>
/// Clone the DatItem
/// </summary>
/// <returns>Clone of the DatItem</returns>
/// <remarks>
/// Throws an exception if there is a DatItem implementation
/// that is not a part of this library.
/// </remarks>
public override object Clone()
{
var concrete = Array.Find(Assembly.GetExecutingAssembly().GetTypes(),
t => !t.IsAbstract && t.IsClass && t.BaseType == typeof(DatItem<T>));
var clone = Activator.CreateInstance(concrete!);
(clone as DatItem<T>)!._internal = _internal?.Clone() as T ?? Activator.CreateInstance<T>();
return clone;
}
/// <summary>
/// Get a clone of the current internal model
/// </summary>

View File

@@ -53,6 +53,9 @@ namespace SabreTools.Metadata.DatItems.Formats
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Adjuster(_internal.Clone() as Data.Models.Metadata.Adjuster ?? []);
/// <inheritdoc/>
public override Data.Models.Metadata.Adjuster GetInternalClone()
{

View File

@@ -29,5 +29,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Analog(_internal.Clone() as Data.Models.Metadata.Analog ?? []);
#endregion
}
}

View File

@@ -96,5 +96,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Archive(_internal.Clone() as Data.Models.Metadata.Archive ?? []);
#endregion
}
}

View File

@@ -35,5 +35,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new BiosSet(_internal.Clone() as Data.Models.Metadata.BiosSet ?? []);
#endregion
}
}

View File

@@ -40,5 +40,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Chip(_internal.Clone() as Data.Models.Metadata.Chip ?? []);
#endregion
}
}

View File

@@ -36,5 +36,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Condition(_internal.Clone() as Data.Models.Metadata.Condition ?? []);
#endregion
}
}

View File

@@ -35,5 +35,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new ConfLocation(_internal.Clone() as Data.Models.Metadata.ConfLocation ?? []);
#endregion
}
}

View File

@@ -53,6 +53,9 @@ namespace SabreTools.Metadata.DatItems.Formats
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new ConfSetting(_internal.Clone() as Data.Models.Metadata.ConfSetting ?? []);
/// <inheritdoc/>
public override Data.Models.Metadata.ConfSetting GetInternalClone()
{

View File

@@ -83,6 +83,9 @@ namespace SabreTools.Metadata.DatItems.Formats
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Configuration(_internal.Clone() as Data.Models.Metadata.Configuration ?? []);
/// <inheritdoc/>
public override Data.Models.Metadata.Configuration GetInternalClone()
{

View File

@@ -68,5 +68,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Control(_internal.Clone() as Data.Models.Metadata.Control ?? []);
#endregion
}
}

View File

@@ -45,5 +45,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new DataArea(_internal.Clone() as Data.Models.Metadata.DataArea ?? []);
#endregion
}
}

View File

@@ -76,6 +76,9 @@ namespace SabreTools.Metadata.DatItems.Formats
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Device(_internal.Clone() as Data.Models.Metadata.Device ?? []);
/// <inheritdoc/>
public override Data.Models.Metadata.Device GetInternalClone()
{

View File

@@ -29,5 +29,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new DeviceRef(_internal.Clone() as Data.Models.Metadata.DeviceRef ?? []);
#endregion
}
}

View File

@@ -35,5 +35,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new DipLocation(_internal.Clone() as Data.Models.Metadata.DipLocation ?? []);
#endregion
}
}

View File

@@ -109,6 +109,9 @@ namespace SabreTools.Metadata.DatItems.Formats
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new DipSwitch(_internal.Clone() as Data.Models.Metadata.DipSwitch ?? []);
/// <inheritdoc/>
public override Data.Models.Metadata.DipSwitch GetInternalClone()
{

View File

@@ -53,6 +53,9 @@ namespace SabreTools.Metadata.DatItems.Formats
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new DipValue(_internal.Clone() as Data.Models.Metadata.DipValue ?? []);
/// <inheritdoc/>
public override Data.Models.Metadata.DipValue GetInternalClone()
{

View File

@@ -100,6 +100,9 @@ namespace SabreTools.Metadata.DatItems.Formats
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Disk(_internal.Clone() as Data.Models.Metadata.Disk ?? []);
/// <summary>
/// Convert a disk to the closest Rom approximation
/// </summary>

View File

@@ -30,5 +30,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new DiskArea(_internal.Clone() as Data.Models.Metadata.DiskArea ?? []);
#endregion
}
}

View File

@@ -140,5 +140,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Display(_internal.Clone() as Data.Models.Metadata.Display ?? []);
#endregion
}
}

View File

@@ -76,5 +76,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Driver(_internal.Clone() as Data.Models.Metadata.Driver ?? []);
#endregion
}
}

View File

@@ -29,5 +29,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Extension(_internal.Clone() as Data.Models.Metadata.Extension ?? []);
#endregion
}
}

View File

@@ -44,5 +44,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Feature(_internal.Clone() as Data.Models.Metadata.Feature ?? []);
#endregion
}
}

View File

@@ -29,5 +29,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Info(_internal.Clone() as Data.Models.Metadata.Info ?? []);
#endregion
}
}

View File

@@ -73,6 +73,9 @@ namespace SabreTools.Metadata.DatItems.Formats
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Input(_internal.Clone() as Data.Models.Metadata.Input ?? []);
/// <inheritdoc/>
public override Data.Models.Metadata.Input GetInternalClone()
{

View File

@@ -29,5 +29,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Instance(_internal.Clone() as Data.Models.Metadata.Instance ?? []);
#endregion
}
}

View File

@@ -53,6 +53,9 @@ namespace SabreTools.Metadata.DatItems.Formats
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Media(_internal.Clone() as Data.Models.Metadata.Media ?? []);
/// <summary>
/// Convert a media to the closest Rom approximation
/// </summary>

View File

@@ -40,5 +40,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Part(_internal.Clone() as Data.Models.Metadata.Part ?? []);
#endregion
}
}

View File

@@ -53,5 +53,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new PartFeature(_internal.Clone() as Data.Models.Metadata.Feature ?? []);
#endregion
}
}

View File

@@ -52,6 +52,9 @@ namespace SabreTools.Metadata.DatItems.Formats
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Port(_internal.Clone() as Data.Models.Metadata.Port ?? []);
/// <inheritdoc/>
public override Data.Models.Metadata.Port GetInternalClone()
{

View File

@@ -35,5 +35,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new RamOption(_internal.Clone() as Data.Models.Metadata.RamOption ?? []);
#endregion
}
}

View File

@@ -35,5 +35,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Release(_internal.Clone() as Data.Models.Metadata.Release ?? []);
#endregion
}
}

View File

@@ -374,6 +374,13 @@ namespace SabreTools.Metadata.DatItems.Formats
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Rom(_internal.Clone() as Data.Models.Metadata.Rom ?? []);
#endregion
#region Comparision Methods
/// <summary>

View File

@@ -29,5 +29,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Sample(_internal.Clone() as Data.Models.Metadata.Sample ?? []);
#endregion
}
}

View File

@@ -29,5 +29,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new SharedFeat(_internal.Clone() as Data.Models.Metadata.SharedFeat ?? []);
#endregion
}
}

View File

@@ -52,6 +52,9 @@ namespace SabreTools.Metadata.DatItems.Formats
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Slot(_internal.Clone() as Data.Models.Metadata.Slot ?? []);
/// <inheritdoc/>
public override Data.Models.Metadata.Slot GetInternalClone()
{

View File

@@ -35,5 +35,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new SlotOption(_internal.Clone() as Data.Models.Metadata.SlotOption ?? []);
#endregion
}
}

View File

@@ -39,5 +39,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new SoftwareList(_internal.Clone() as Data.Models.Metadata.SoftwareList ?? []);
#endregion
}
}

View File

@@ -35,5 +35,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Sound(_internal.Clone() as Data.Models.Metadata.Sound ?? []);
#endregion
}
}