2011-11-25 12 views
10

मैं नीचे की तरह शब्दकोश कनवर्टर करने के लिए एक सरल वस्तु लिखने के लिए कोशिश कर रहा हूँ: जब मैं फोन करने के लिए प्रयास करते हैं,बेनामी प्रकार और WP7.1 पर एक्सेसर्स प्राप्त करें?

public static class SimplePropertyDictionaryExtensionMethods 
{ 
    public static IDictionary<string,string> ToSimplePropertyDictionary(this object input) 
    { 
     if (input == null) 
      return new Dictionary<string, string>(); 

     var propertyInfos = from property in input.GetType() 
           .GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy | BindingFlags.GetProperty) 
          where property.CanRead 
          select property; 

     return propertyInfos.ToDictionary(x => x.Name, x => input.GetPropertyValueAsString(x)); 
    } 

    public static string GetPropertyValueAsString(this object input, PropertyInfo propertyInfo) 
    { 
     var value = propertyInfo.GetGetMethod().Invoke(input, new object[] {}); 
     if (value == null) 
      return string.Empty ; 

     return value.ToString(); 
    } 
} 

हालांकि इस तरह:

var test = (new { Foo="12", Bar=15 }).ToSimplePropertyDictionary(); 

तो यह एक अपवाद के साथ विफल:

[System.MethodAccessException]: {"Attempt to access the method failed: .<>f__AnonymousType0`1.get_Foo()"} 

क्या यह आम पर "सुरक्षा" कहने पर आम सुरक्षा मॉडल है? क्या इसके चारों ओर कोई रास्ता है? ऐसा लगता है कि यह एक सार्वजनिक प्राप्तकर्ता है - तो ऐसा लगता है कि मुझे इसे आमंत्रित करने में सक्षम होना चाहिए?

स्टुअर्ट

उत्तर

8

मुझे लगता है कि आपके ToSimplePropertyDictionary विधि और वास्तविक उपयोग दो अलग विधानसभाओं में हैं। यह आपकी समस्या का स्रोत है क्योंकि एक अज्ञात वर्ग से उत्पन्न संकलक जेनरेट क्लास internal है। यही कारण है कि आप MethodAccessException अपवाद प्राप्त करते हैं। तो आपको इसे काम करने के लिए InternalsVisibleToAttribute का उपयोग करने की आवश्यकता है। यह SO question में आंतरिक प्रकार और प्रतिबिंब के बारे में अधिक जानकारी है।

+0

धन्यवाद! यह एक अच्छा जवाब की तरह लगता है – Stuart

+0

हमारे पास एक विजेता है - धन्यवाद! – Stuart

+0

मिमी, अच्छा जवाब। मैंने कभी इस बारे में सोचा नहीं होगा कि बाइंडिंगफ्लैग्स। संपत्ति प्राप्त करते समय सार्वजनिक पास हो जाता है। मैंने सोचा होगा कि अज्ञात प्रकार आंतरिक होने पर कोई गुण वापस नहीं किया गया होगा, भले ही एमएसडीएन कहता है कि गुण सार्वजनिक हैं (जो माता-पिता वर्ग नहीं है तो अजीब लगता है)। – calum

1

BindingFlags.GetProperty

निकालें यह जब InvokeMember का उपयोग कर एक संपत्ति के मूल्य प्राप्त करने के लिए प्रयोग किया जाता है, यह आप चाहते हैं कि एक रीड ओनली संपत्ति लौटे निर्दिष्ट नहीं है।

संपादित करें: समस्या वास्तव में propertyInfo.GetGetMethod() के साथ हो सकता है - (मैं ही कभी पहले एक का इस्तेमाल किया है) निम्न में से एक का उपयोग कर प्रयास करें:

var value = propertyInfo.GetValue(input, null); 
var value = propertyInfo.GetGetMethod().Invoke(input, null); 
संबंधित मुद्दे