2010-04-02 39 views
34

Ví dụ,Làm thế nào để có được tên biến bằng cách sử dụng sự phản chiếu?

static void Main() 
{ 
    var someVar = 3; 

    Console.Write(GetVariableName(someVar)); 
} 

Kết quả của chương trình này sẽ là:

someVar 

Làm thế nào tôi có thể đạt được điều đó bằng sự phản ánh?

+1

@helen câu hỏi của tôi khá đơn giản, trái ngược với sự phân tán của một câu hỏi mà anh ấy nghĩ ra, mà tôi vẫn nghĩ là khá khác biệt. –

+0

Điều gì có thể là lý do đằng sau điều này? – Dested

Trả lời

57

Không thể thực hiện điều này với sự phản ánh, vì các biến sẽ không có tên khi được biên dịch sang IL. Tuy nhiên, bạn có thể sử dụng cây biểu hiện và phát huy biến để đóng cửa:

static string GetVariableName<T>(Expression<Func<T>> expr) 
{ 
    var body = (MemberExpression)expr.Body; 

    return body.Member.Name; 
} 

Bạn có thể sử dụng phương pháp này như sau:

static void Main() 
{ 
    var someVar = 3; 

    Console.Write(GetVariableName(() => someVar)); 
} 

Lưu ý rằng điều này là khá chậm, do đó, không sử dụng nó trong các đường dẫn quan trọng về hiệu suất của ứng dụng của bạn. Mỗi khi mã này chạy, một số đối tượng được tạo ra (gây ra áp lực GC) và bên dưới bao gồm nhiều phương thức không thể khắc phục được gọi và một số phản xạ nặng được sử dụng.

Để biết ví dụ hoàn chỉnh hơn, hãy xem here.

CẬP NHẬT

Với C# 6.0, các từ khóa nameof được thêm vào ngôn ngữ, cho phép chúng ta làm như sau:

static void Main() 
{ 
    var someVar = 3; 

    Console.Write(nameof(someVar)); 
} 

Điều này rõ ràng là thuận tiện hơn nhiều và có cùng chi phí đã xác định chuỗi là chuỗi ký tự không đổi.

+0

Tôi không chắc chắn rằng nó thực sự xấu về hiệu suất. Điều gì có thể gây ra vấn đề hiệu suất là biên dịch cây biểu thức, nhưng bạn không làm điều đó ở đây. –

+0

Hãy tìm bản thân của bạn, nơi 'GetVariableName (() => someVar)' được biên dịch để sử dụng Reflector. Mỗi khi mã này chạy, một số đối tượng được tạo và dưới lớp phủ nhiều phương thức không thể khắc phục được gọi và một số phản xạ nặng được sử dụng. Sử dụng cây biểu thức không phải là miễn phí. – Steven

+0

Có, bạn đã đúng. Nó có chi phí hiệu suất. Nhưng nó "tương đối" nhỏ so với việc biên soạn các cây biểu thức. –

0

Bạn không thể sử dụng phản chiếu. GetVariableName được chuyển số 3, không phải là biến. Bạn có thể làm điều này thông qua mã kiểm tra của IL, nhưng đó có thể là trong giỏ quá cứng.

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