我正在创建一个inf
文件解析器(Windows驱动程序,理论上类似于infs,实际上完全不同)。
我有一个父InfFile
类,其中包含Sections
和Keys
形式的结构化但未解析的数据(我将其称为未解析的,因为它未被转换为比Sections
和Keys
更有用的东西,与之后的其他数据相反,但也可以访问一些已分析的数据,例如SupportedOperatingSystems
,{{1 },Folders
等。
我遇到的问题是,在Folder.Files
文件中可以引用4种inf
:Folders
,default
,X86
和{ {1}}。因此,尝试将所有与文件夹相关的代码转移到Ia64
类,并使用属性Amd64
,InfFolders
,Default
和{{1} (我不能简单地合并它们)。
但是,为了找出其中引用了哪些文件夹,我需要访问X86
类的Ia64
和Amd64
属性。这意味着:
Sections
类包含对其父级的引用(我认为这可能不是最佳解决方案),Keys
首先解析数据,然后将其作为构造函数的一部分传递给InfFile
,但这意味着所有InfFolders
逻辑现在都存在于InfFile
中再次上课,InfFolders
和Folder
传递给InfFile
作为构造函数的一部分,并具有将它们排序为可用对象的逻辑。这样做的最佳方式是什么?在这种情况下最佳做法是什么?
Sections
类的概念是这样的:
Keys
正如您在方法InfFolders
中所看到的,有两个地方需要对父项的引用。
我可以将所有代码转移到InfFolders
并完全删除public class InfFolders
{
public IReadOnlyCollection<InfSourceFolder> Default()
{
return GetFolders("SourceDiskNames").ToList().AsReadOnly();
}
public IReadOnlyCollection<InfSourceFolder> X86()
{
return GetFolders("SourceDiskNames.X86").ToList().AsReadOnly();
}
public IReadOnlyCollection<InfSourceFolder> Ia64()
{
return GetFolders("SourceDisksNames.Ia64").ToList().AsReadOnly();
}
public IReadOnlyCollection<InfSourceFolder> Amd64()
{
return GetFolders("SourceDisksNames.Amd64").ToList().AsReadOnly();
}
private IEnumerable<InfSourceFolder> GetFolders(string sectionName)
{
return <InfFile reference>[sectionName]?.Keys?.Select(
x =>
new InfSourceFolder(Convert.ToInt32(x.Name),
new FileInfo(<InfFile reference>.FilePath).DirectoryName + x.Values.ElementAtOrDefault(3)));
}
}
类,但不要认为这也是一个非常好的模型。我看到它的方式是有4个属性都与同一个东西有关,所以它们应该组合在一起。