प्रतिबिंब के माध्यम से एक सार्वजनिक स्थिर क्षेत्र का मूल्य प्राप्त करें


85

यह वही है जो मैंने अब तक किया है:

 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

जवाबों:


161

उत्तीर्ण होने के लिए की जरूरत nullके लिए GetValueके बाद से इस क्षेत्र को किसी भी घटना से संबंधित नहीं है,:

props[0].GetValue(null)

2
कोई अधिभार नहीं है केवल एक पैरामीटर ले रहा है? msdn.microsoft.com/en-us/library/…
— पाउली Maysterø

4
@Pauli: वैरिएबल के नाम के बावजूद, यह एक फील्डइंफो है, न कि एक प्रॉपर्टीफो
— थॉमस लेवेस्क


7

का हस्ताक्षर FieldInfo.GetValueहै

public abstract Object GetValue(
    Object obj
)

objवह वस्तु उदाहरण कहाँ है जहाँ से आप मान प्राप्त करना चाहते हैं या nullयदि वह एक स्थिर वर्ग है। तो यह करना चाहिए:

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

1
चर नामों पर भरोसा न करें ... ओपी GetFields को बुला रहा है, न कि GetProperties;)
— थॉमस लेवेस्क

@ Pauli null? sterø दूसरे से क्या मेल खाता है? FieldInfo.GetValueकेवल एक ही पैरामीटर को स्वीकार नहीं करता है ? मुझे लगता है कि GetValueकुछ भी नहीं मिल रहा है या कुछ भी नहीं मिल सकता है
— थॉमस फ्लिंको

@ThomasFlinkow मात्र टाइपो, इसका अब तय
— पाउली Jansterø

@ Pauli makesterø ने ऐसा सोचा :) बस यह सुनिश्चित करना चाहते थे कि प्रश्न में कोड कॉपी-पेस्ट तैयार हो। तो एक अच्छे उत्तर के लिए +1।
— थॉमस फ्लिन्को

4

इसे इस्तेमाल करे

FieldInfo fieldInfo = typeof(Settings.Lookup).GetFields(BindingFlags.Static | BindingFlags.Public)[0];
    object value = fieldInfo.GetValue(null); // value = "abc"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.