private Type[] GetContainerConstructor(IDesignerSerializationManager manager) { if (this._containerConstructor == null) { this._containerConstructor = new Type[] { CodeDomSerializerBase.GetReflectionTypeFromTypeHelper(manager, typeof(IContainer)) }; } return(this._containerConstructor); }
public virtual object Deserialize(IDesignerSerializationManager manager, CodeTypeDeclaration declaration) { if (manager == null) { throw new ArgumentNullException("manager"); } if (declaration == null) { throw new ArgumentNullException("declaration"); } object obj2 = null; using (CodeDomSerializerBase.TraceScope("TypeCodeDomSerializer::Deserialize")) { bool caseInsensitive = false; CodeDomProvider service = manager.GetService(typeof(CodeDomProvider)) as CodeDomProvider; if (service != null) { caseInsensitive = (service.LanguageOptions & LanguageOptions.CaseInsensitive) != LanguageOptions.None; } Type type = null; string name = declaration.Name; foreach (CodeTypeReference reference in declaration.BaseTypes) { Type type2 = manager.GetType(CodeDomSerializerBase.GetTypeNameFromCodeTypeReference(manager, reference)); name = reference.BaseType; if ((type2 != null) && !type2.IsInterface) { type = type2; break; } } if (type == null) { CodeDomSerializerBase.Error(manager, System.Design.SR.GetString("SerializerTypeNotFound", new object[] { name }), "SerializerTypeNotFound"); } if (CodeDomSerializerBase.GetReflectionTypeFromTypeHelper(manager, type).IsAbstract) { CodeDomSerializerBase.Error(manager, System.Design.SR.GetString("SerializerTypeAbstract", new object[] { type.FullName }), "SerializerTypeAbstract"); } ResolveNameEventHandler handler = new ResolveNameEventHandler(this.OnResolveName); manager.ResolveName += handler; obj2 = manager.CreateInstance(type, null, declaration.Name, true); int count = declaration.Members.Count; this._nameTable = new HybridDictionary(count, caseInsensitive); this._statementTable = new Dictionary <string, CodeDomSerializerBase.OrderedCodeStatementCollection>(count); Dictionary <string, string> names = new Dictionary <string, string>(count); RootContext context = new RootContext(new CodeThisReferenceExpression(), obj2); manager.Context.Push(context); try { StringComparison comparisonType = caseInsensitive ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal; foreach (CodeTypeMember member in declaration.Members) { CodeMemberField field = member as CodeMemberField; if ((field != null) && !string.Equals(field.Name, declaration.Name, comparisonType)) { this._nameTable[field.Name] = field; if ((field.Type != null) && !string.IsNullOrEmpty(field.Type.BaseType)) { names[field.Name] = CodeDomSerializerBase.GetTypeNameFromCodeTypeReference(manager, field.Type); } } } CodeMemberMethod[] initializeMethods = this.GetInitializeMethods(manager, declaration); if (initializeMethods == null) { throw new InvalidOperationException(); } foreach (CodeMemberMethod method in initializeMethods) { foreach (CodeStatement statement in method.Statements) { CodeVariableDeclarationStatement statement2 = statement as CodeVariableDeclarationStatement; if (statement2 != null) { this._nameTable[statement2.Name] = statement; } } } this._nameTable[declaration.Name] = context.Expression; foreach (CodeMemberMethod method2 in initializeMethods) { CodeDomSerializerBase.FillStatementTable(manager, this._statementTable, names, method2.Statements, declaration.Name); } PropertyDescriptor descriptor = manager.Properties["SupportsStatementGeneration"]; if (((descriptor != null) && (descriptor.PropertyType == typeof(bool))) && ((bool)descriptor.GetValue(manager))) { foreach (string str2 in this._nameTable.Keys) { if (!this._statementTable.ContainsKey(str2)) { continue; } CodeStatementCollection statements = this._statementTable[str2]; bool flag2 = false; foreach (CodeStatement statement3 in statements) { object obj3 = statement3.UserData["GeneratedStatement"]; if (((obj3 == null) || !(obj3 is bool)) || !((bool)obj3)) { flag2 = true; break; } } if (!flag2) { this._statementTable.Remove(str2); } } } base.DeserializePropertiesFromResources(manager, obj2, _designTimeFilter); CodeDomSerializerBase.OrderedCodeStatementCollection[] array = new CodeDomSerializerBase.OrderedCodeStatementCollection[this._statementTable.Count]; this._statementTable.Values.CopyTo(array, 0); Array.Sort(array, StatementOrderComparer.Default); CodeDomSerializerBase.OrderedCodeStatementCollection statements2 = null; foreach (CodeDomSerializerBase.OrderedCodeStatementCollection statements3 in array) { if (statements3.Name.Equals(declaration.Name)) { statements2 = statements3; } else { this.DeserializeName(manager, statements3.Name, statements3); } } if (statements2 != null) { this.DeserializeName(manager, statements2.Name, statements2); } } finally { this._nameTable = null; this._statementTable = null; manager.ResolveName -= handler; manager.Context.Pop(); } } return(obj2); }
public override object Serialize(IDesignerSerializationManager manager, object value) { CodeStatementCollection statements = null; PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value); using (CodeDomSerializerBase.TraceScope("ComponentCodeDomSerializer::Serialize")) { if ((manager == null) || (value == null)) { throw new ArgumentNullException((manager == null) ? "manager" : "value"); } if (base.IsSerialized(manager, value)) { return(base.GetExpression(manager, value)); } InheritanceLevel notInherited = InheritanceLevel.NotInherited; InheritanceAttribute attribute = (InheritanceAttribute)TypeDescriptor.GetAttributes(value)[typeof(InheritanceAttribute)]; if (attribute != null) { notInherited = attribute.InheritanceLevel; } if (notInherited == InheritanceLevel.InheritedReadOnly) { return(statements); } statements = new CodeStatementCollection(); CodeTypeDeclaration declaration = manager.Context[typeof(CodeTypeDeclaration)] as CodeTypeDeclaration; RootContext context = manager.Context[typeof(RootContext)] as RootContext; CodeExpression left = null; bool flag = false; bool flag2 = true; bool flag3 = true; bool flag4 = false; left = base.GetExpression(manager, value); if (left != null) { flag = false; flag2 = false; flag3 = false; IComponent component = value as IComponent; if ((component != null) && (component.Site == null)) { ExpressionContext context2 = manager.Context[typeof(ExpressionContext)] as ExpressionContext; if ((context2 == null) || (context2.PresetValue != value)) { flag4 = true; } } } else { if (notInherited == InheritanceLevel.NotInherited) { PropertyDescriptor descriptor = properties["GenerateMember"]; if (((descriptor != null) && (descriptor.PropertyType == typeof(bool))) && !((bool)descriptor.GetValue(value))) { flag = true; flag2 = false; } } else { flag3 = false; } if (context == null) { flag = true; flag2 = false; } } manager.Context.Push(value); manager.Context.Push(statements); try { try { string name = manager.GetName(value); string className = TypeDescriptor.GetClassName(value); if ((flag2 || flag) && (name != null)) { if (flag2) { if (notInherited == InheritanceLevel.NotInherited) { MemberAttributes @private; CodeMemberField field = new CodeMemberField(className, name); PropertyDescriptor descriptor2 = properties["Modifiers"]; if (descriptor2 == null) { descriptor2 = properties["DefaultModifiers"]; } if ((descriptor2 != null) && (descriptor2.PropertyType == typeof(MemberAttributes))) { @private = (MemberAttributes)descriptor2.GetValue(value); } else { @private = MemberAttributes.Private; } field.Attributes = @private; declaration.Members.Add(field); } left = new CodeFieldReferenceExpression(context.Expression, name); } else { if (notInherited == InheritanceLevel.NotInherited) { CodeVariableDeclarationStatement statement = new CodeVariableDeclarationStatement(className, name); statements.Add(statement); } left = new CodeVariableReferenceExpression(name); } } if (flag3) { CodeExpression expression2; IContainer service = manager.GetService(typeof(IContainer)) as IContainer; ConstructorInfo info = null; if (service != null) { info = CodeDomSerializerBase.GetReflectionTypeHelper(manager, value).GetConstructor(BindingFlags.ExactBinding | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly, null, this.GetContainerConstructor(manager), null); } if (info != null) { expression2 = new CodeObjectCreateExpression(className, new CodeExpression[] { base.SerializeToExpression(manager, service) }); } else { bool flag5; expression2 = base.SerializeCreationExpression(manager, value, out flag5); } if (expression2 != null) { if (left == null) { if (flag4) { left = expression2; } } else { CodeAssignStatement statement2 = new CodeAssignStatement(left, expression2); statements.Add(statement2); } } } if (left != null) { base.SetExpression(manager, value, left); } if ((left != null) && !flag4) { bool flag6 = value is ISupportInitialize; if (flag6) { string fullName = typeof(ISupportInitialize).FullName; flag6 = manager.GetType(fullName) != null; } Type c = null; if (flag6) { c = CodeDomSerializerBase.GetReflectionTypeHelper(manager, value); flag6 = CodeDomSerializerBase.GetReflectionTypeFromTypeHelper(manager, typeof(ISupportInitialize)).IsAssignableFrom(c); } bool flag7 = (value is IPersistComponentSettings) && ((IPersistComponentSettings)value).SaveSettings; if (flag7) { string typeName = typeof(IPersistComponentSettings).FullName; flag7 = manager.GetType(typeName) != null; } if (flag7) { c = c ?? CodeDomSerializerBase.GetReflectionTypeHelper(manager, value); flag7 = CodeDomSerializerBase.GetReflectionTypeFromTypeHelper(manager, typeof(IPersistComponentSettings)).IsAssignableFrom(c); } IDesignerSerializationManager manager2 = (IDesignerSerializationManager)manager.GetService(typeof(IDesignerSerializationManager)); if (flag6) { this.SerializeSupportInitialize(manager, statements, left, value, "BeginInit"); } base.SerializePropertiesToResources(manager, statements, value, _designTimeFilter); ComponentCache serviceInstance = (ComponentCache)manager.GetService(typeof(ComponentCache)); ComponentCache.Entry entry = null; if (serviceInstance == null) { IServiceContainer container2 = (IServiceContainer)manager.GetService(typeof(IServiceContainer)); if (container2 != null) { serviceInstance = new ComponentCache(manager); container2.AddService(typeof(ComponentCache), serviceInstance); } } else if (((manager == manager2) && (serviceInstance != null)) && serviceInstance.Enabled) { entry = serviceInstance[value]; } if ((entry == null) || entry.Tracking) { if (entry == null) { entry = new ComponentCache.Entry(serviceInstance); ComponentCache.Entry entryAll = null; entryAll = serviceInstance.GetEntryAll(value); if (((entryAll != null) && (entryAll.Dependencies != null)) && (entryAll.Dependencies.Count > 0)) { foreach (object obj2 in entryAll.Dependencies) { entry.AddDependency(obj2); } } } entry.Component = value; bool flag8 = manager == manager2; entry.Valid = flag8 && this.CanCacheComponent(manager, value, properties); if ((flag8 && (serviceInstance != null)) && serviceInstance.Enabled) { manager.Context.Push(serviceInstance); manager.Context.Push(entry); } try { entry.Statements = new CodeStatementCollection(); base.SerializeProperties(manager, entry.Statements, value, _runTimeFilter); base.SerializeEvents(manager, entry.Statements, value, null); foreach (CodeStatement statement3 in entry.Statements) { if (statement3 is CodeVariableDeclarationStatement) { entry.Tracking = true; break; } } if (entry.Statements.Count > 0) { entry.Statements.Insert(0, new CodeCommentStatement(string.Empty)); entry.Statements.Insert(0, new CodeCommentStatement(name)); entry.Statements.Insert(0, new CodeCommentStatement(string.Empty)); if ((flag8 && (serviceInstance != null)) && serviceInstance.Enabled) { serviceInstance[value] = entry; } } } finally { if ((flag8 && (serviceInstance != null)) && serviceInstance.Enabled) { manager.Context.Pop(); manager.Context.Pop(); } } } else if (((entry.Resources != null) || (entry.Metadata != null)) && ((serviceInstance != null) && serviceInstance.Enabled)) { ResourceCodeDomSerializer.Default.ApplyCacheEntry(manager, entry); } statements.AddRange(entry.Statements); if (flag7) { this.SerializeLoadComponentSettings(manager, statements, left, value); } if (flag6) { this.SerializeSupportInitialize(manager, statements, left, value, "EndInit"); } } return(statements); } catch (CheckoutException) { throw; } catch (Exception exception) { manager.ReportError(exception); } return(statements); } finally { manager.Context.Pop(); manager.Context.Pop(); } } return(statements); }