|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections;
namespace System.ComponentModel.Design.Serialization;
public sealed partial class CodeDomComponentSerializationService
{
private sealed partial class CodeDomSerializationStore
{
private class PassThroughSerializationManager : IDesignerSerializationManager
{
private readonly HashSet<string> _resolved = [];
private ResolveNameEventHandler? _resolveNameEventHandler;
public PassThroughSerializationManager(DesignerSerializationManager manager) => Manager = manager;
public DesignerSerializationManager Manager { get; }
ContextStack IDesignerSerializationManager.Context
{
get => ((IDesignerSerializationManager)Manager).Context;
}
PropertyDescriptorCollection IDesignerSerializationManager.Properties
{
get => ((IDesignerSerializationManager)Manager).Properties;
}
event ResolveNameEventHandler IDesignerSerializationManager.ResolveName
{
add
{
((IDesignerSerializationManager)Manager).ResolveName += value;
_resolveNameEventHandler += value;
}
remove
{
((IDesignerSerializationManager)Manager).ResolveName -= value;
_resolveNameEventHandler -= value;
}
}
event EventHandler IDesignerSerializationManager.SerializationComplete
{
add => ((IDesignerSerializationManager)Manager).SerializationComplete += value;
remove => ((IDesignerSerializationManager)Manager).SerializationComplete -= value;
}
void IDesignerSerializationManager.AddSerializationProvider(IDesignerSerializationProvider provider)
{
((IDesignerSerializationManager)Manager).AddSerializationProvider(provider);
}
object IDesignerSerializationManager.CreateInstance(Type type, ICollection? arguments, string? name, bool addToContainer)
{
return ((IDesignerSerializationManager)Manager).CreateInstance(type, arguments, name, addToContainer);
}
object? IDesignerSerializationManager.GetInstance(string name)
{
object? instance = ((IDesignerSerializationManager)Manager).GetInstance(name);
// If an object is retrieved from the current container as a result of GetInstance(),
// we need to make sure and fully deserialize it before returning it.
// To do this, we will force a resolve on this name and not interfere the next time GetInstance()
// is called with this component. This will force the component to completely deserialize.
if (_resolveNameEventHandler is not null && instance is not null &&
Manager.PreserveNames && Manager.Container?.Components[name] is not null && _resolved.Add(name))
{
_resolveNameEventHandler(this, new ResolveNameEventArgs(name));
}
return instance;
}
string? IDesignerSerializationManager.GetName(object value)
{
return ((IDesignerSerializationManager)Manager).GetName(value);
}
object? IDesignerSerializationManager.GetSerializer(Type? objectType, Type serializerType)
{
return ((IDesignerSerializationManager)Manager).GetSerializer(objectType, serializerType);
}
Type? IDesignerSerializationManager.GetType(string typeName)
{
return ((IDesignerSerializationManager)Manager).GetType(typeName);
}
void IDesignerSerializationManager.RemoveSerializationProvider(IDesignerSerializationProvider provider)
{
((IDesignerSerializationManager)Manager).RemoveSerializationProvider(provider);
}
void IDesignerSerializationManager.ReportError(object errorInformation)
{
((IDesignerSerializationManager)Manager).ReportError(errorInformation);
}
void IDesignerSerializationManager.SetName(object instance, string name)
{
((IDesignerSerializationManager)Manager).SetName(instance, name);
}
object? IServiceProvider.GetService(Type serviceType)
{
return ((IDesignerSerializationManager)Manager).GetService(serviceType);
}
}
}
}
|