Nhận giá trị của trường tĩnh công khai thông qua phản chiếu


85

Đây là những gì tôi đã làm cho đến nay:

 var fields = typeof (Settings.Lookup).GetFields();
 Console.WriteLine(fields[0].GetValue(Settings.Lookup)); 
         // Compile error, Class Name is not valid at this point

Và đây là lớp tĩnh của tôi:

public static class Settings
{
   public static class Lookup
   {
      public static string F1 ="abc";
   }
}

10
Chỉ cần lưu ý rằng việc gọi biến propsthay vì fieldscó thể gây nhầm lẫn cho nhà phát triển trong tương lai. Thuộc tính là những thứ riêng của chúng, và các trường chắc chắn không phải là chúng.
— ErikE

Câu trả lời:




7

Chữ ký của FieldInfo.GetValuelà

public abstract Object GetValue(
    Object obj
)

đâu objlà cá thể đối tượng mà bạn muốn lấy giá trị từ đó hoặc nullnếu đó là một lớp tĩnh. Vì vậy, điều này nên làm:

var props = typeof (Settings.Lookup).GetFields();
Console.WriteLine(props[0].GetValue(null)); 

1
Đừng tin tưởng vào các tên biến ... OP đang gọi GetFields, không phải GetProperties;)
— Thomas Levesque

@ PauliØsterø cái thứ hai nulltương ứng với cái gì? Không FieldInfo.GetValuechỉ chấp nhận một tham số duy nhất? Tôi dường như không thể tìm thấy định nghĩa chồng cho GetValuehay bất cứ điều gì
— Thomas Flinkow

@ThomasFlinkow chỉ có lỗi đánh máy, hiện đã được sửa
— Pauli Østerø

@ PauliØsterø nghĩ vậy :) chỉ muốn đảm bảo rằng mã trong câu hỏi đã sẵn sàng sao chép-dán. Vì vậy, +1 cho một câu trả lời hay.
— Thomas Flinkow

4

Thử đi

FieldInfo fieldInfo = typeof(Settings.Lookup).GetFields(BindingFlags.Static | BindingFlags.Public)[0];
    object value = fieldInfo.GetValue(null); // value = "abc"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.