असल में, मुझे यह पूछना चाहिए: मैं यह कैसे कर सकता हूं और सीएलएस अनुपालन बने रहें? क्योंकि ऐसा करने का एकमात्र तरीका मैं इस प्रकार सोच सकता हूं, लेकिन __makeref
, FieldInfo.SetValueDirect
या केवल System.TypedReference
का उपयोग सामान्य रूप से सीएलएस अनुपालन को अमान्य करता है।क्या मैं बॉक्सिंग के बिना प्रतिबिंब के माध्यम से एक संरचना पर एक मूल्य निर्धारित कर सकता हूं?
// code illustrating the issue:
TestFields fields = new TestFields { MaxValue = 1234 }; // test struct with one field
FieldInfo info = fields.GetType().GetField("MaxValue"); // get the FieldInfo
// actual magic, no boxing, not CLS compliant:
TypedReference reference = __makeref(fields);
info.SetValueDirect(reference, 4096);
SetValueDirect
के अनुरूप समकक्ष SetValue
है, लेकिन यह लक्ष्य के रूप में एक वस्तु ले जाता है, इसलिए मेरी struct बॉक्सिंग किया जाएगा, मुझे बनाने एक प्रति, नहीं मूल चर पर एक मूल्य की स्थापना।
SetValue
के लिए एक सामान्य समकक्ष जहां तक मुझे पता है, अस्तित्व में नहीं है। प्रतिबिंब के माध्यम से एक (संदर्भ के लिए) संरचना के क्षेत्र को स्थापित करने का कोई अन्य तरीका है?
शायद मैं CLSCompliancy को समझ नहीं पा रहा हूं, मैंने सोचा था कि इसका मतलब है कि आप _use_ गैर-अनुरूप सुविधाओं को नहीं कर सकते। यदि इसकी अनुमति है, तो यह चीजों को वास्तव में बहुत आसान बनाता है। – Abel
@Abel: सीएलएस अनुपालन का मतलब है कि आपके सार्वजनिक सदस्य केवल सीएलएस-अनुरूप प्रकार का संदर्भ देते हैं। यह आपके सदस्यों में क्या शामिल है इसके बारे में कुछ भी नहीं कहता है। – Gabe
ओह, मेरी टिप्पणी-संपादन खो गया। हां, मैंने देखा, यह सीएलएस अनुपालन पर एमएसडीएन पर शीर्ष तीन गोलियों से स्पष्ट है (http://msdn.microsoft.com/en-us/library/bhc3fa7f.aspx)। फिर भी यह बहुत अजीब लगता है कि मुझे इसे काम करने के लिए एक [अनूदित कीवर्ड __makeref] (http://www.codeproject.com/Articles/38695/UnCommon-C-keywords-A-Look#makref) चाहिए। – Abel