2009-12-27 12 views
6

मैं एक वर्ग का एक उदाहरण है की एक फ़ील्ड का मान बदल रहा है, मैं इस उदाहरण का एक उद्देश्य डेटा सदस्य केवल एक ही प्रकार (स्वैप) की एक और वस्तु के साथ, कारण बदलना चाहते हैं मेरे सिस्टम की बाधाओं के लिए मैं =, नए या सेटर ऑपरेटर का उपयोग नहीं कर सकता।सी # परावर्तन - एक चर

मूल रूप से मैं एक चर के क्षेत्र के मान को बदलना चाहता हूं, फ़ील्ड एक अन्य वस्तु के अंदर एक वस्तु है - चर जो इसके उदाहरण है।

क्या यह प्रतिबिंब का उपयोग कर संभव है? यदि ऐसा है तो कृपया मुझे बुनियादी दिशा दे सकते हैं?

धन्यवाद Yoav

+0

आप कुछ कोड साझा कर सकते हैं, कृपया ? –

+0

क्या वह मूल्य है जिसे आप किसी संपत्ति या फ़ील्ड को बदलना चाहते हैं? यदि यह एक संपत्ति है, तो क्या आप इसके पीछे वाले क्षेत्र का नाम जानते हैं? - असल में यदि किसी प्रॉपर्टी में सेट एक्सेसर नहीं है, तो आप इसका मान (प्रतिबिंब का उपयोग करके भी) नहीं बदल सकते हैं, हालांकि यदि इसके पीछे कोई फ़ील्ड है, भले ही यह निजी हो, तो आप प्रतिबिंब का उपयोग करके इसे (आमतौर पर) बदल सकते हैं। कुछ मामलों में (मैं इसके संदर्भ को याद करने में विफल रहता हूं) आप निजी क्षेत्रों में प्रतिबिंब पहुंच से इंकार कर सकते हैं। –

उत्तर

13

हाँ, यह संभव है।

संक्षेप में, एक छिपा हुआ (निजी/संरक्षित/आंतरिक) फ़ील्ड का मान बदलने के लिए

Type typeInQuestion = typeof(TypeHidingTheField); 
FieldInfo field = typeInQuestion.GetField("FieldName", BindingFlags.NonPublic | BindingFlags.Instance); 
field.SetValue(instanceOfObject, newValue); 

की तरह कुछ है। पढ़ने के लिए संबंधित FieldInfo.GetValue(...) का उपयोग करें; अपने वांछित स्वैपिंग ऑपरेशन प्राप्त करने के लिए दो छोटे से गठबंधन करें।

मुझे बाध्यकारीफ्लैग पर न रखें (मुझे हमेशा पहले प्रयास में उन गलत लगता है) या सटीक वाक्यविन्यास, लेकिन यह मूल रूप से यह है।

संदर्भ के लिए System.Reflection पर देखो।

+0

बाइंडिंगफ्लैग अच्छा दिखता है लेकिन सार्वजनिक भी शामिल करना चाह सकता है ... बाइंडिंगफ्लैग .ऑनपब्लिक | बाइंडिंगफ्लैग्स। सार्वजनिक | BindingFlags.Instance – David

4

आप .NET 3.5 का उपयोग करते हैं, तो आप उस संबोधित करने के लिए निम्न कोड के साथ मेरी खुला स्रोत पुस्तकालय, Fasterflect, उपयोग कर सकते हैं:

typeof(MyType).SetField("MyField", anotherObject); 

Fasterflect उपयोग करते समय, आप के साथ परेशान करने के लिए नहीं है सही बाध्यकारीफ्लैग विनिर्देश और प्रदर्शन निहितार्थ (जैसे प्रतिबिंब का उपयोग करते समय)।

जेनरिक साथ vb में
0

, लेकिन मौलिक त्रुटि हैंडलिंग:

Module somereflectionops 
    Function GetFieldValue(Of OBTYPE, FIELDTYPE)(instance As OBTYPE, fieldname As String, Optional specbindingflags As BindingFlags = BindingFlags.NonPublic Or BindingFlags.Instance) As FIELDTYPE 
     Dim ot As Type = GetType(OBTYPE) 
     Dim fi As FieldInfo 
     Try 
      fi = ot.GetField(fieldname, BindingFlags.Default Or specbindingflags) 
      If fi Is Nothing Then Return Nothing 
      Return fi.GetValue(instance) 
     Catch ex As Exception 
      Return Nothing 
     End Try 
    End Function 

    Function SetFieldValue(Of OBTYPE, FIELDTYPE)(instance As OBTYPE, fieldname As String, value As FIELDTYPE, Optional specbindingflags As BindingFlags = BindingFlags.NonPublic Or BindingFlags.Instance) As Boolean 
     Dim ot As Type = GetType(OBTYPE) 
     Dim fi As FieldInfo 
     Try 
      fi = ot.GetField(fieldname, BindingFlags.Default Or specbindingflags) 
      If fi Is Nothing Then Return false 
      fi.SetValue(instance, value) 
      Return True 
     Catch ex As Exception 
      Return False 
     End Try 
    End Function 
End Module 

उपयोग: SetFieldValue (cartonclass से पूर्णांक) (cartonyoudropped, "survivingeggcount", 3)

संबंधित मुद्दे