2012-04-25 6 views
6

संपादित करें: दृश्य स्टूडियो को पुनरारंभ करने से इस समस्या को कोई कोड परिवर्तन नहीं हुआ है।डायनामिक ऑब्जेक्ट - रनटाइम रिपोर्ट फ़ील्ड मौजूद नहीं है लेकिन इसे डीबगर में देख सकता है?


मैं एक ConfigSection हैंडलर गतिशील प्रकार और एक expando वस्तु का उपयोग करता है। परीक्षण 'ऑब्जेक्ट' की रिपोर्टिंग में विफल रहता है 'SportName' के लिए परिभाषा नहीं है। मैंने कॉन्फ़िगरेशन हैंडलर को समीकरण के बाहर ले जाने वाले कंसोल में दोहराने की कोशिश की है, लेकिन समतुल्य कोड की तरह दिखता है कि ठीक काम करता है। मैं उलझन में हूं।

परीक्षण, ConfigurationSectionHandler और config एक्सएमएल

public class SportSection : IConfigurationSectionHandler 
{ 
    public object Create(object parent, object configContext, XmlNode section) 
    { 
     var doc = XDocument.Parse(section.OuterXml); 
     var root = (XElement)doc.FirstNode; 

     try 
     { 
      var sportList = root.Element("sportList").Elements("sport").Select(ToSport); 

      dynamic config = new ExpandoObject(); 
      config.SportList = sportList; 

      return config; 
     } 
     catch (Exception ex) 
     { 
      throw new ConfigurationErrorsException("Invalid SportSection configuration", ex); 
     } 
    } 

    private static dynamic ToSport(XElement sportElement) 
    { 
     try 
     { 
      var getAttrib = new Func<XElement, string, string>((x, atr) => x.Attribute(atr).Value); 
      var getDictionary = 
       new Func<IEnumerable<XElement>, IDictionary<string, string>>(elems => elems.ToDictionary(x => x.Attribute("name").Value, y => y.Attribute("value").Value)); 

      return new 
      { 
       SportName = sportElement.Attribute("name").Value, 
       EventProperties = getDictionary(sportElement.Element("eventProperties").Elements("property")), 
       CompetitionProperties = getDictionary(sportElement.Element("competitionProperties").Elements("property")), 
       MappedMarkets = sportElement.Element("mapping").Elements("market").Select(x => new MappedMarket() { Type = getAttrib(x, "type"), MappedType = getAttrib(x, "mappedType") }) 
      }; 
     } 
     catch (Exception ex) 
     { 

      throw ex; 
     } 

    } 
} 


[Test] 
    public void GoodConfig() 
    { 
     var document = new XmlDocument(); 
     document.LoadXml(Resources.ValidSportSectionConfig); 

     var config = new SportSection().Create(null, null, document) as dynamic; 

     IEnumerable<dynamic> sportList = config.SportList; 

     Assert.AreEqual(1, sportList.Count()); 
     //Microsoft.CSharp.RuntimeBinder.RuntimeBinderException : 'object' does not contain a definition for 'SportName' 
     Assert.AreEqual("Baseball", sportList.Select(x => (string) x.SportName).First()); 

     var eventProperties = sportList.First(x => x.SportName == "Baseball").EventProperties as IDictionary<string, string>; 

     Assert.AreEqual(2, eventProperties.Count); 
     Assert.AreEqual("BSB", eventProperties["SportId"]); 
     Assert.AreEqual("THA", eventProperties["CompetitorReferenceId"]); 

     var compProps = sportList.First(x => x.SportName == "Baseball").CompetitionProperties as IDictionary<string, string>; 
     Assert.AreEqual(2, compProps.Count); 
     Assert.AreEqual("BSB", compProps["SportId"]); 
     Assert.AreEqual("CUP", compProps["CompetitionOrgMethodId"]); 

     var mappedMarkets = (sportList.First(x => x.SportName == "Baseball").MappedMarkets as IEnumerable<MappedMarket>).ToList(); 
     Assert.AreEqual(2, mappedMarkets.Count()); 
     Assert.AreEqual("match_winner" , mappedMarkets[0].Type); 
     Assert.AreEqual("BSBAO", mappedMarkets[0].MappedType); 
     Assert.AreEqual("handicap", mappedMarkets[0].Type); 
     Assert.AreEqual("BSBAQ", mappedMarkets[0].MappedType); 
    } 

<sportSettings> 
    <sportList> 
    <sport name="Baseball"> 
    <eventProperties> 
     <property name="SportId" value="BSB"></property> 
     <property name="CompetitorReferenceId" value="THA"></property> 
    </eventProperties> 
    <competitionProperties> 
     <property name="SportId" value="BSB" /> 
     <property name="CompetitionOrgMethodId" value="CUP" /> 
    </competitionProperties> 
    <mapping> 
     <market type="match_winner" mappedType="BSBAO" /> 
     <market type="handicap" mappedType="BSBAQ" /> 
    </mapping> 
    </sport> 
    </sportList> 
</sportSettings> 

अद्यतन के लिए नीचे देखें - स्टैक ट्रेस: ​​

at CallSite.Target(Closure , CallSite , Object) 
at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0) 
at SS.Integration.EVenue.WindowsService.UnitTests.Configuration.SportSectionTests.<GoodConfig>b__11(Object x) in C:\_Git\SS.Integration.EVenue\SS.Integration.EVenue.WindowsService.UnitTests\Configuration\SportSectionTests.cs:line 35 
+1

कोड सही लग रहा है, और आप इसे कंसोल में ठीक चलाता है की पुष्टि करें। परीक्षण डीबग करने का प्रयास करें, और 'अपवाद' अपवाद अपवाद। फिर स्थानीय लोगों का निरीक्षण करके कॉलस्टैक (बाहरी कोड दिखाएं) के शीर्ष पर खुदाई शुरू करें। – leppie

+0

यदि आपका मतलब है कि डीबग में 'थ्रोउन' टिकटें> अपवाद संवाद तो उसी बिंदु पर टूट जाता है .. कॉल स्टैक के साथ अद्यतन किया गया है, thx –

+1

हाँ, मेरा मतलब है। अब जब यह टूट जाता है, तो शीर्ष 2 फ्रेम में स्थानीय लोगों का निरीक्षण करें। आप असेंबली से आईएल का निरीक्षण भी कर सकते हैं यह देखने के लिए कि क्या कुछ अस्वस्थ है या नहीं। – leppie

उत्तर

3

ToSport एक ExpandoObject से एक गुमनाम प्रकार देता है बल्कि। जब आप अज्ञात प्रकार को डायनामिक में डालते हैं तो आपको सावधान रहना होगा, क्योंकि उन प्रकारों में internal का एक्सेस संशोधक है। इस प्रकार, यदि आप असेंबली सीमाओं को पार करते हैं तो रनटाइम किसी भी पहुंच योग्य गुण नहीं देखेगा। प्रयास करें:

private static dynamic ToSport(XElement sportElement) 
    { 
     try 
     { 
      var getAttrib = new Func<XElement, string, string>((x, atr) => x.Attribute(atr).Value); 
      var getDictionary = 
       new Func<IEnumerable<XElement>, IDictionary<string, string>>(elems => elems.ToDictionary(x => x.Attribute("name").Value, y => y.Attribute("value").Value)); 


      dynamic n = new ExpandoObject(); 
      n.SportName = sportElement.Attribute("name").Value; 
      n.EventProperties = getDictionary(sportElement.Element("eventProperties").Elements("property")); 
      n.CompetitionProperties = getDictionary(sportElement.Element("competitionProperties").Elements("property")); 
      n.MappedMarkets = sportElement.Element("mapping").Elements("market").Select(x => new MappedMarket() { Type = getAttrib(x, "type"), MappedType = getAttrib(x, "mappedType") }); 

      return n; 
     } 
     catch (Exception ex) 
     { 

      throw ex; 
     } 

    } 
+0

जो मैंने अनुभव की समस्या को समझाएगा, हालांकि यह स्पष्ट नहीं करता है कि वीएस को फिर से शुरू करने के कारण इसे ठीक क्यों किया गया। अजीब। –

+1

अलग-अलग प्रकार के निर्माण कभी-कभी अस्पष्ट हो सकते हैं जहां असेंबली सीमा होती है। उदाहरण के लिए, एएसपी.नेट में ऐसे पृष्ठ होते हैं जो फ्लाई पर संकलित होते हैं, वे अलग-अलग असेंबली में समूहित करके यादृच्छिक रूप से कर सकते हैं। मुझे नहीं पता कि वीएस ने इसे क्यों तय किया है, लेकिन मुझे पता है कि एक्सपांडो ऑब्जेक्ट्स के साथ चलने वाले गुमनाम प्रकारों को गतिशील करने के लिए यह वास्तव में एक अच्छा अभ्यास है। – jbtule

+0

अच्छी सलाह, धन्यवाद! –

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

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