如何从 VSIX(/MPF) 代码中获取项目中的文件列表?
How can I obtain the list of files in a project from VSIX(/MPF) code?
我正在构建一个 VSIX 包以使用 MPF 在 Visual Studio 中支持自定义语言。我在一个自定义设计器中,我需要找到项目中引用的文件来解决一些依赖关系。我在哪里可以访问此列表?
我假设您正在使用 MPF
为您的自定义语言服务实施项目系统。这样做时,您可能有一个项目根节点,它派生自 ProjectNode
或 HierarchyNode
...
如果是这样,您可以与设计人员共享根节点的实例,并尝试通过遍历层次结构来查找文件,例如...
internal class HierarchyVisitor
{
private readonly Func<HierarchyNode, bool> filterCallback;
public HierarchyVisitor(
Func<HierarchyNode, bool> filter)
{
this.filterCallback = filter;
}
public IEnumerable<HierarchyNode> Visit(
HierarchyNode node)
{
var stack = new Stack<HierarchyNode>();
stack.Push(node);
while (stack.Any())
{
HierarchyNode next = stack.Pop();
if (this.filterCallback(next))
{
yield return next;
}
for (
HierarchyNode child = next.FirstChild;
child != null;
child = child.NextSibling)
{
stack.Push(child);
}
}
}
}
要获取层次结构中所有节点的列表,您可以这样做...
ProjectNode root = ...
var visitor = new HierarchyVisitor(x => true);
IEnumerable<HierarchyNode> flatList = visitor.Visit(root);
或者要过滤特定的文件类型,您可以尝试这样的操作...
ProjectNode root = ...
var visitor = new HierarchyVisitor((HierarchyNode x) =>
{
const string XmlFileExtension = ".xml";
string path = new Uri(x.Url, UriKind.Absolut).LocalPath;
return string.Compare(
XmlFileExtension,
Path.GetFileExtension(path),
StringComparison.InvariantCultureIgnoreCase) == 0;
});
IEnumerable<HierarchyNode> xmlFiles = visitor.Visit(root);
我正在构建一个 VSIX 包以使用 MPF 在 Visual Studio 中支持自定义语言。我在一个自定义设计器中,我需要找到项目中引用的文件来解决一些依赖关系。我在哪里可以访问此列表?
我假设您正在使用 MPF
为您的自定义语言服务实施项目系统。这样做时,您可能有一个项目根节点,它派生自 ProjectNode
或 HierarchyNode
...
如果是这样,您可以与设计人员共享根节点的实例,并尝试通过遍历层次结构来查找文件,例如...
internal class HierarchyVisitor
{
private readonly Func<HierarchyNode, bool> filterCallback;
public HierarchyVisitor(
Func<HierarchyNode, bool> filter)
{
this.filterCallback = filter;
}
public IEnumerable<HierarchyNode> Visit(
HierarchyNode node)
{
var stack = new Stack<HierarchyNode>();
stack.Push(node);
while (stack.Any())
{
HierarchyNode next = stack.Pop();
if (this.filterCallback(next))
{
yield return next;
}
for (
HierarchyNode child = next.FirstChild;
child != null;
child = child.NextSibling)
{
stack.Push(child);
}
}
}
}
要获取层次结构中所有节点的列表,您可以这样做...
ProjectNode root = ...
var visitor = new HierarchyVisitor(x => true);
IEnumerable<HierarchyNode> flatList = visitor.Visit(root);
或者要过滤特定的文件类型,您可以尝试这样的操作...
ProjectNode root = ...
var visitor = new HierarchyVisitor((HierarchyNode x) =>
{
const string XmlFileExtension = ".xml";
string path = new Uri(x.Url, UriKind.Absolut).LocalPath;
return string.Compare(
XmlFileExtension,
Path.GetFileExtension(path),
StringComparison.InvariantCultureIgnoreCase) == 0;
});
IEnumerable<HierarchyNode> xmlFiles = visitor.Visit(root);