2012-06-09 10 views
5

Come trovare il percorso del file .cs in base al tipo?Come trovare il percorso del file .cs in base al suo tipo in C#

Prototipo della funzione:

string FindPath(Type);

Restituisce qualcosa come "C: \ Projects \ ..... \" MyClass.cs

+0

Perché avete bisogno di questo? Non sono sicuro che sia possibile in fase di esecuzione poiché tutto il codice è compilato in un assembly. – alexn

+0

Interrompe l'applicazione (debug + interrompe il debug) e ricostruisce il progetto. – adatapost

risposta

2

Tutte le classi vengono compilati nelle assemblee (exe o .dll). Non penso che tu possa ottenere il percorso del file sorgente di una classe, perché quella classe potrebbe anche non esistere (se hai copiato il file .exe su un'altra macchina).

Ma è possibile ottenere il percorso dell'assembly corrente (file .exe) in esecuzione. Partenza questa risposta: Get the Assembly path C#

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

Questa risposta dovrebbe essere cancellata o convertita in un commento. –

+0

@ChrisMarisic Non sono d'accordo, questa è una risposta valida con informazioni rilevanti e una buona spiegazione del perché ciò non è possibile. – ForceMagic

6

questo non è possibile, non esiste una relazione. Una classe può essere parziale, quindi può provenire anche da diversi file sorgente.

+0

Probabilmente hai ragione ... grazie – satellite

+0

Penso che potrebbe essere possibile con una build di debug, perché ci sono abbastanza informazioni di debug memorizzate per mostrare il nome del file e il numero di riga in tracce dello stack (ad esempio http://msdn.microsoft .com/it-it/library/system.diagnostics.stacktrace.aspx). Non sono sicuro di come accedere a queste informazioni, però. –

+2

@TimS .: Le informazioni di debug sono lì, quindi è possibile risalire in qualche modo, ma è possibile ottenere solo il file sorgente per istruzione, non per classe. – Guffa

12

In .Net 4.5 è possibile utilizzare l'attributo CallerFilePath riflessione (da 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 

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

+0

Questo può essere usato per tracciare posizioni di file facendo qualcosa sulla falsariga di 'public HomeController(): base (TraceFileLocation())' dove la classe base registra le posizioni. Se lo stai facendo a livello di istanza potresti voler memorizzare nella cache i valori di '[CallerFilePath]' in una raccolta statica per evitare di fare del lavoro non necessario se stai analizzando i percorsi (che mi aspetterei di ottenere effettivamente dal valore Questo) –

Problemi correlati