private INameScopeDictionary HuntAroundForARootNameScope(ObjectWriterFrame rootFrame) { object instance = rootFrame.Instance; if ((instance == null) && rootFrame.XamlType.IsNameScope) { throw new InvalidOperationException(System.Xaml.SR.Get("NameScopeOnRootInstance")); } INameScopeDictionary nameScopeDictionary = null; nameScopeDictionary = instance as INameScopeDictionary; if (nameScopeDictionary == null) { INameScope underlyingNameScope = instance as INameScope; if (underlyingNameScope != null) { nameScopeDictionary = new NameScopeDictionary(underlyingNameScope); } } if (nameScopeDictionary == null) { XamlType xamlType = rootFrame.XamlType; if (xamlType.UnderlyingType != null) { XamlMember nameScopeProperty = TypeReflector.LookupNameScopeProperty(xamlType); if (nameScopeProperty != null) { INameScope scope2 = (INameScope)this._runtime.GetValue(instance, nameScopeProperty, false); if (scope2 == null) { nameScopeDictionary = new NameScope(); this._runtime.SetValue(instance, nameScopeProperty, nameScopeDictionary); } else { nameScopeDictionary = scope2 as INameScopeDictionary; if (nameScopeDictionary == null) { nameScopeDictionary = new NameScopeDictionary(scope2); } } } } } if (((nameScopeDictionary == null) && (this._settings != null)) && this._settings.RegisterNamesOnExternalNamescope) { ObjectWriterFrame previous = (ObjectWriterFrame)rootFrame.Previous; nameScopeDictionary = previous.NameScopeDictionary; } if (nameScopeDictionary == null) { nameScopeDictionary = new NameScope(); } rootFrame.NameScopeDictionary = nameScopeDictionary; return(nameScopeDictionary); }
private XAML3.INameScopeDictionary HuntAroundForARootNameScope(ObjectWriterFrame rootFrame) { Debug.Assert(rootFrame.Depth == 1); object inst = rootFrame.Instance; if (inst == null && rootFrame.XamlType.IsNameScope) { throw new InvalidOperationException(SR.Get(SRID.NameScopeOnRootInstance)); } XAML3.INameScopeDictionary nameScopeDictionary = null; nameScopeDictionary = inst as XAML3.INameScopeDictionary; if (nameScopeDictionary == null) { XAML3.INameScope nameScope = inst as XAML3.INameScope; if (nameScope != null) { nameScopeDictionary = new NameScopeDictionary(nameScope); } } // If the root instance isn't a name scope // then perhaps it designated a property as the name scope. if (nameScopeDictionary == null) { XamlType xamlType = rootFrame.XamlType; if (xamlType.UnderlyingType != null) { // Get the Name Scope Property (from attribute on the class) XamlMember nameScopeProperty = TypeReflector.LookupNameScopeProperty(xamlType); if (nameScopeProperty != null) { // Read the value of the property. If it is an object we are good. // if it is null create a stock name scope dictionary object and assign it back. XAML3.INameScope nameScope = (XAML3.INameScope)_runtime.GetValue(inst, nameScopeProperty, false); if (nameScope == null) { #if TARGETTING35SP1 nameScopeDictionary = new NameScopeDictionary(new NameScope()); #else nameScopeDictionary = new NameScope(); #endif _runtime.SetValue(inst, nameScopeProperty, nameScopeDictionary); } else { nameScopeDictionary = nameScope as XAML3.INameScopeDictionary; if (nameScopeDictionary == null) { nameScopeDictionary = new NameScopeDictionary(nameScope); } } } } } if (nameScopeDictionary == null && _settings != null && _settings.RegisterNamesOnExternalNamescope) { ObjectWriterFrame frameZero = (ObjectWriterFrame)rootFrame.Previous; nameScopeDictionary = frameZero.NameScopeDictionary; } // Otherwise we still need a namescope at the root of the parse // for our own usage. For IXamlNameResolver() to use. if (nameScopeDictionary == null) { #if TARGETTING35SP1 nameScopeDictionary = new NameScopeDictionary(new NameScope()); #else nameScopeDictionary = new NameScope(); #endif } rootFrame.NameScopeDictionary = nameScopeDictionary; return(nameScopeDictionary); }