รับค่าของฟิลด์คงที่สาธารณะผ่านการสะท้อน


90

นี่คือสิ่งที่ฉันได้ทำไปแล้ว:

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

และนี่คือคลาสคงที่ของฉัน:

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

10
โปรดทราบว่าการเรียกใช้ตัวแปรpropsแทนการเรียกใช้ตัวแปรfieldsอาจทำให้ผู้พัฒนาในอนาคตสับสน คุณสมบัติเป็นสิ่งที่มีอยู่ในตัวมันเองและไม่ใช่สาขาที่แน่นอน
ErikE

คำตอบ:


164

คุณต้องผ่านnullไปGetValueเนื่องจากข้อมูลนี้ไม่ได้เป็นเช่นใด

props[0].GetValue(null)

2
ไม่มีการโอเวอร์โหลดเพียงพารามิเตอร์เดียว? msdn.microsoft.com/en-us/library/…
Pauli Østerø

5
@Pauli: แม้จะมีชื่อของตัวแปร แต่นี่คือ FieldInfo ไม่ใช่ Propertyinfo
Thomas Levesque


7

ลายเซ็นของFieldInfo.GetValueis

public abstract Object GetValue(
    Object obj
)

objอินสแตนซ์ออบเจ็กต์ที่คุณต้องการดึงค่าจากที่ไหนหรือnullถ้าเป็นคลาสแบบคงที่ สิ่งนี้ควรทำ:

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

1
อย่าเชื่อถือชื่อตัวแปร ... OP เรียก GetFields ไม่ใช่ GetProperties;)
Thomas Levesque

@ PauliØsterøประการที่สองnullสอดคล้องกับอะไร? ไม่FieldInfo.GetValueยอมรับเพียงพารามิเตอร์เดียว? ดูเหมือนว่าฉันจะไม่พบสิ่งที่เกินพิกัดGetValueหรืออะไรเลย
Thomas Flinkow

@ThomasFlinkow พิมพ์ผิดแก้ไขแล้วตอนนี้
Pauli Østerø

@ PauliØsterøคิดอย่างนั้น :) แค่ต้องการให้แน่ใจว่ารหัสในคำถามนั้นพร้อมคัดลอกวาง ดังนั้น +1 สำหรับคำตอบที่ดี
Thomas Flinkow

4

ลองทำตามนี้

FieldInfo fieldInfo = typeof(Settings.Lookup).GetFields(BindingFlags.Static | BindingFlags.Public)[0];
    object value = fieldInfo.GetValue(null); // value = "abc"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.