readonly
मतलब यह है कि क्षेत्र काम केवल क्षेत्र घोषणा के पास या एक निर्माता के अंदर हो सकता है। तो तुम एक FieldInfo
पर IsInitOnly
संपत्ति है, जो
यह बताते हैं कि क्षेत्र में केवल निर्माता
अधिक जानकारी IsInitOnly
MSDN article
FieldInfo f = typeof(Bla).GetField("sum");
Console.WriteLine(f.IsInitOnly); //return true
पर हैं के मुख्य भाग में स्थापित किया जा सकता एक मूल्य हो जाता है का उपयोग कर सकते
नोट: आप भी अगर क्षेत्र समय निरंतर संकलित किया गया है परीक्षण करने के लिए IsLiteral
संपत्ति का उपयोग कर सकते हैं। यह readonly
क्षेत्र के लिए अवास्तविक लौटाते हैं, लेकिन क्षेत्र के लिए सच है, const
के साथ चिह्नित।
एक और नोट: प्रतिबिंब आपको readonly
और private
फ़ील्ड में लिखने से नहीं रोकता है (यह public readonly
के लिए भी सच है, लेकिन मैं एक और प्रतिबंधित केस दिखाना चाहता हूं)। तो अगली कोड उदाहरण मान्य होते हैं और किसी भी अपवाद फेंक नहीं होगा:
class Bla
{
//note field is private now
private readonly int sum = 0;
}
अब आप क्षेत्र हो और (मैं BindingFlags
का उपयोग निजी गैर स्थिर क्षेत्रों पाने के लिए यह करने के लिए एक मूल्य के बारे में है, क्योंकि GetField
जीता ' निजी क्षेत्रों के लिए टी वापसी FieldInfo
डिफ़ॉल्ट रूप से)
FieldInfo field = typeof(Bla).GetField("sum", BindingFlags.NonPublic |
BindingFlags.Instance);
var bla = new Bla();
field.SetValue(bla, 42);
Console.WriteLine(field.GetValue(bla)); //prints 42
सभी ठीक काम करता है। यह केवल एक अपवाद फेंक देगा यदि कोई फ़ील्ड const
है।
स्रोत
2013-03-31 14:17:21
किसी भी विचार क्या 'NonPublic' झंडा यहाँ क्या कर रहा है को शामिल करना चाहिए? – nawfal
@nawfal 'GetField' डिफ़ॉल्ट रूप से निजी फ़ील्ड वापस नहीं करेगा। आपको इसे स्पष्ट रूप से –
@ ओह हां सेट करने की आवश्यकता है। मैंने 'निजी 'के बारे में आपका उदाहरण नहीं देखा था। धन्यवाद – nawfal