2012-06-09 25 views
5

Cách tìm đường dẫn đến tệp .cs theo loại của nó?Cách tìm đường dẫn đến tệp .cs theo loại của nó trong C#

Prototype của hàm:

string FindPath(Type);

Returns cái gì đó như "C: \ Projects \ ..... \ MyClass.cs"

+0

Tại sao bạn cần điều này? Tôi không chắc chắn nó có thể ở thời gian chạy vì tất cả các mã được biên dịch thành một hội đồng. – alexn

+0

Dừng ứng dụng (Gỡ lỗi + Gỡ lỗi dừng) và xây dựng lại dự án của bạn. – adatapost

Trả lời

2

Tất cả các lớp được biên soạn trong hội đồng (.exe hoặc .dll. Tôi không nghĩ rằng bạn có thể nhận được đường dẫn đến tệp nguồn của một lớp, bởi vì lớp đó có thể không tồn tại (nếu bạn đã sao chép tệp .exe sang một máy khác).

Nhưng bạn có thể lấy đường dẫn đến cụm hiện tại (tệp .exe) đang chạy. Hãy xem câu trả lời này: Get the Assembly path C#

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

Câu trả lời này sẽ bị xóa hoặc chuyển đổi thành nhận xét. –

+0

@ChrisMarisic Tôi không đồng ý, đây là câu trả lời hợp lệ với thông tin liên quan và giải thích lý do tại sao điều này là không thể. – ForceMagic

6

Điều đó là không thể, không có mối quan hệ như vậy. Một lớp có thể là một phần, vì vậy nó thậm chí có thể đến từ một số tệp nguồn khác nhau.

+0

Có lẽ bạn đang đúng ... cảm ơn – satellite

+0

Tôi nghĩ rằng nó có thể là có thể với một xây dựng Debug, bởi vì có đủ thông tin gỡ lỗi được lưu trữ để hiển thị tên tập tin và số dòng trong ngăn xếp dấu vết (ví dụ như http://msdn.microsoft .com/vi-us/library/system.diagnostics.stacktrace.aspx). Tuy nhiên, tôi không chắc chắn cách truy cập thông tin này. –

+2

@TimS .: Thông tin gỡ lỗi ở đó, vì vậy có thể đào nó lên bằng cách nào đó, nhưng bạn chỉ có thể lấy tệp nguồn cho mỗi câu lệnh chứ không phải mỗi lớp. – Guffa

12

Trong Net 4.5, bạn có thể sử dụng thuộc tính CallerFilePath phản xạ (từ 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 

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

+0

Điều này có thể được sử dụng để theo dõi vị trí của các tập tin bằng cách làm một cái gì đó dọc theo dòng 'public HomeController(): base (TraceFileLocation())' trong đó lớp cơ sở ghi lại các vị trí. Nếu bạn đang thực hiện nó trên một mức cá thể, bạn có thể muốn lưu các giá trị của '[CallerFilePath]' trong một bộ sưu tập tĩnh để ngăn chặn việc làm không cần thiết nếu bạn phân tích cú pháp các đường dẫn (mà tôi mong đợi thực sự nhận được giá trị từ điều này) –

Các vấn đề liên quan