【问题标题】:How to find path to .cs file by its type in C#如何在 C# 中按类型查找 .cs 文件的路径
【发布时间】:2012-06-09 10:03:00
【问题描述】:

如何按类型查找 .cs 文件的路径?

函数原型:

string FindPath(Type);

返回类似 "C:\Projects\.....\MyClass.cs"

【问题讨论】:

  • 为什么需要这个?我不确定在运行时是否可行,因为所有代码都被编译成程序集。
  • 停止应用程序(调试 + 停止调试)并重建您的项目。

标签: c#


【解决方案1】:

在 .Net 4.5 中,您可以使用 CallerFilePath 反射属性(来自 MSDN):

// using System.Runtime.CompilerServices 
// using System.Diagnostics; 

public void DoProcessing()
{
    TraceMessage("Something happened.");
}

public void TraceMessage(string message,
        [CallerMemberName] string memberName = "",
        [CallerFilePath] string sourceFilePath = "",
        [CallerLineNumber] int sourceLineNumber = 0)
{
    Trace.WriteLine("message: " + message);
    Trace.WriteLine("member name: " + memberName);
    Trace.WriteLine("source file path: " + sourceFilePath);
    Trace.WriteLine("source line number: " + sourceLineNumber);
}

// Sample Output: 
//  message: Something happened. 
//  member name: DoProcessing 
//  source file path: c:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoCS\CallerInfoCS\Form1.cs 
//  source line number: 31

见:http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callerfilepathattribute(v=vs.110).aspx

【讨论】:

  • 这可用于跟踪文件的位置,方法是沿着基类记录位置的public HomeController() : base(TraceFileLocation()) 行做一些事情。如果您在实例级别上执行此操作,您可能希望将 [CallerFilePath] 的值缓存在静态集合中,以防止在解析路径时做不必要的工作(我希望实际从中获得价值)
【解决方案2】:

这是不可能的,没有这样的关系。一个类可以是部分的,因此它甚至可以来自多个不同的源文件。

【讨论】:

  • 我认为使用 Debug 构建可能是可行的,因为存储了足够的调试信息来显示堆栈跟踪中的文件名和行号(例如 msdn.microsoft.com/en-us/library/…)。不过,我不确定如何访问此信息。
  • @TimS.:调试信息就在那里,所以有可能以某种方式对其进行挖掘,但您只能获取每个语句的源文件,而不是每个类。
【解决方案3】:

所有类都在程序集(.exe 或 .dll)中编译。我认为您无法获取类的源文件的路径,因为该类甚至可能不存在(如果您已将 .exe 文件复制到另一台机器)。

但您可以获得当前正在运行的程序集(.exe 文件)的路径。看看这个答案:Get the Assembly path C#

string file = (new System.Uri(Assembly.GetExecutingAssembly().CodeBase)).AbsolutePath;

【讨论】:

  • 这个答案应该被删除或转换为评论。
  • @ChrisMarisic 我不同意,这是一个包含相关信息的有效答案,并很好地解释了为什么这是不可能的。
  • 运行时目录通常不同于构建/编译目录。运行时目录对于文件管理来说很重要。构建目录对于分支检测之类的事情来说很重要。
【解决方案4】:

如果您在 Visual Studio 中查看,我们可以使用“Go to Defenition 或 F12”直接跳转到特定类型的源代码,我相信这是通过使用 Workspace API 实现的,深入挖掘 Workspace API 功能可能会发现一些解决方案.

此处的文档链接:Workspace

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2011-07-09
    • 1970-01-01
    相关资源
    最近更新 更多