diff --git a/SabreTools.Serialization/Extensions/PortableExecutable.cs b/SabreTools.Serialization/Extensions/PortableExecutable.cs
index b39ce9f1..dd71dd66 100644
--- a/SabreTools.Serialization/Extensions/PortableExecutable.cs
+++ b/SabreTools.Serialization/Extensions/PortableExecutable.cs
@@ -995,6 +995,7 @@ namespace SabreTools.Data.Extensions
///
/// Resource data entry to parse into a string table resource
/// A filled string table resource on success, null on error
+ /// TODO: Create concrete type for this and inherit from ResourceDataType
public static Dictionary? AsStringTable(this Models.PortableExecutable.Resource.DataEntry? entry)
{
// If we have an invalid entry, just skip
diff --git a/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/AcceleratorTable.cs b/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/AcceleratorTable.cs
index a4e92407..207edae1 100644
--- a/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/AcceleratorTable.cs
+++ b/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/AcceleratorTable.cs
@@ -9,7 +9,7 @@ namespace SabreTools.Data.Models.PortableExecutable.Resource.Entries
/// by eight. Then your application can randomly access the individual fixed-length entries.
///
///
- public sealed class AcceleratorTable
+ public sealed class AcceleratorTable : ResourceDataType
{
///
/// Accelerator table entries
diff --git a/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/AssemblyManifest.cs b/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/AssemblyManifest.cs
index bce58e0b..b1103ccd 100644
--- a/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/AssemblyManifest.cs
+++ b/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/AssemblyManifest.cs
@@ -4,7 +4,7 @@ namespace SabreTools.Data.Models.PortableExecutable.Resource.Entries
{
///
[XmlRoot(ElementName = "assembly", Namespace = "urn:schemas-microsoft-com:asm.v1")]
- public sealed class AssemblyManifest
+ public sealed class AssemblyManifest : ResourceDataType
{
[XmlAttribute("manifestVersion")]
public string? ManifestVersion { get; set; }
diff --git a/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/DialogBoxResource.cs b/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/DialogBoxResource.cs
index 690fde6e..6f8160a1 100644
--- a/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/DialogBoxResource.cs
+++ b/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/DialogBoxResource.cs
@@ -7,7 +7,7 @@
/// describe the format of extended dialog box resources.
///
///
- public sealed class DialogBoxResource
+ public sealed class DialogBoxResource : ResourceDataType
{
#region Dialog template
diff --git a/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/FontGroupHeader.cs b/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/FontGroupHeader.cs
index 0c209231..fdff33d9 100644
--- a/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/FontGroupHeader.cs
+++ b/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/FontGroupHeader.cs
@@ -5,7 +5,7 @@
/// definition provided here is for explanation only; it is not present in any standard header file.
///
///
- public sealed class FontGroupHeader
+ public sealed class FontGroupHeader : ResourceDataType
{
///
/// The number of individual fonts associated with this resource.
diff --git a/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/MenuResource.cs b/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/MenuResource.cs
index 5828a15b..b30552b0 100644
--- a/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/MenuResource.cs
+++ b/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/MenuResource.cs
@@ -7,7 +7,7 @@
/// describe the format of extended menu resources.
///
///
- public sealed class MenuResource
+ public sealed class MenuResource : ResourceDataType
{
///
/// Menu header structure
diff --git a/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/MessageResourceData.cs b/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/MessageResourceData.cs
index 088f9cce..26329b87 100644
--- a/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/MessageResourceData.cs
+++ b/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/MessageResourceData.cs
@@ -7,7 +7,7 @@ namespace SabreTools.Data.Models.PortableExecutable.Resource.Entries
/// box in a message table resource.
///
///
- public sealed class MessageResourceData
+ public sealed class MessageResourceData : ResourceDataType
{
///
/// The number of MESSAGE_RESOURCE_BLOCK structures.
diff --git a/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/ResourceDataType.cs b/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/ResourceDataType.cs
new file mode 100644
index 00000000..fe320891
--- /dev/null
+++ b/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/ResourceDataType.cs
@@ -0,0 +1,7 @@
+namespace SabreTools.Data.Models.PortableExecutable.Resource.Entries
+{
+ ///
+ /// Generic base class for resource data types
+ ///
+ public abstract class ResourceDataType { }
+}
diff --git a/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/VersionInfo.cs b/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/VersionInfo.cs
index dcc8a9e7..302b5eb1 100644
--- a/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/VersionInfo.cs
+++ b/SabreTools.Serialization/Models/PortableExecutable/Resource/Entries/VersionInfo.cs
@@ -5,7 +5,7 @@
/// structure that contains all other file-version information structures.
///
///
- public sealed class VersionInfo
+ public sealed class VersionInfo : ResourceDataType
{
///
/// The length, in bytes, of the VS_VERSIONINFO structure. This length does not