2012-06-09 7 views
5

¿Cómo encontrar la ruta al archivo .cs por su tipo?Cómo encontrar la ruta al archivo .cs por su tipo en C#

Prototipo de función:

string FindPath(Type);

devoluciones algo así como "C: \ Projects \ ..... \ MyClass.cs"

+0

¿Por qué necesita esto? No estoy seguro de que sea posible en tiempo de ejecución ya que todo el código se compila en un ensamblado. – alexn

+0

Detenga la aplicación (Depurar + Detener depuración) y vuelva a generar su proyecto. – adatapost

Respuesta

2

Todas las clases se compilan en asambleas (.exe o .dll). No creo que pueda obtener la ruta al archivo fuente de una clase, porque esa clase podría no existir (si ha copiado el archivo .exe en otra máquina).

Pero puede obtener la ruta al ensamblado actual (archivo .exe) que se está ejecutando. Confirmar esta respuesta: Get the Assembly path C#

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

Esta respuesta se debe eliminar o convertir a un comentario. –

+0

@ChrisMarisic No estoy de acuerdo, esta es una respuesta válida con información relevante y buena explicación de por qué esto no es posible. – ForceMagic

6

eso no es posible, no hay tal relación. Una clase puede ser parcial, por lo que incluso puede provenir de varios archivos fuente diferentes.

+0

Probablemente tengas razón ... gracias – satellite

+0

Creo que podría ser posible con una compilación Debug, porque hay suficiente información de depuración almacenada para mostrar el nombre del archivo y el número de línea en los rastreos de pila (por ejemplo, http://msdn.microsoft) .com/en-us/library/system.diagnostics.stacktrace.aspx). Aunque no estoy seguro de cómo acceder a esta información. –

+2

@TimS .: la información de depuración está allí, por lo que es posible desenterrarla de alguna manera, pero solo puede obtener el archivo fuente por instrucción, no por clase. – Guffa

12

En .Net 4.5 se puede utilizar el atributo CallerFilePath reflexión (de 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 

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

+0

Esto se puede utilizar para rastrear ubicaciones de archivos haciendo algo en la línea de 'public HomeController(): base (TraceFileLocation())' donde la clase base registra las ubicaciones. Si lo está haciendo en un nivel de instancia, es posible que desee almacenar en caché los valores de '[CallerFilePath]' en una colección estática para evitar hacer un trabajo innecesario si está analizando las rutas (de las cuales esperaría obtener valor de esta) –

Cuestiones relacionadas