e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
49 lines
2.6 KiB
C#
49 lines
2.6 KiB
C#
namespace System.Workflow.ComponentModel.Serialization
|
|
{
|
|
using System;
|
|
using System.CodeDom;
|
|
using System.ComponentModel;
|
|
using System.ComponentModel.Design.Serialization;
|
|
using System.Workflow.ComponentModel.Compiler;
|
|
using System.Collections;
|
|
using System.Collections.Specialized;
|
|
using System.Collections.Generic;
|
|
|
|
// This serializer will serialize any ICollection<String> object into code statements that constructs the collection.
|
|
// The default serializer serializes the collection as resource because ICollection<String> is serializable.
|
|
// We originally add this serializer to deal with the SynchronizationHandles property on SynchronizationScopeActivity.
|
|
// It was a problem because this serializer will be invoked for any property of ICollection<String> type. Now I've
|
|
// made this generic enough to be used by any such properties.
|
|
internal sealed class SynchronizationHandlesCodeDomSerializer : CodeDomSerializer
|
|
{
|
|
public override object Serialize(IDesignerSerializationManager manager, object obj)
|
|
{
|
|
if (manager == null)
|
|
throw new ArgumentNullException("manager");
|
|
if (obj == null)
|
|
throw new ArgumentNullException("obj");
|
|
|
|
CodeExpression retVal = null;
|
|
CodeStatementCollection statements = manager.Context[typeof(CodeStatementCollection)] as CodeStatementCollection;
|
|
System.Diagnostics.Debug.Assert(statements != null);
|
|
if (statements != null)
|
|
{
|
|
Activity activity = (Activity)manager.Context[typeof(Activity)];
|
|
CodeExpression objectExpression = SerializeToExpression(manager, activity);
|
|
ICollection<String> handles = obj as ICollection<String>;
|
|
if (handles == null)
|
|
throw new ArgumentException(SR.GetString(SR.Error_UnexpectedArgumentType, typeof(StringCollection).FullName), "obj");
|
|
|
|
string variableName = GetUniqueName(manager, new StringCollection());
|
|
statements.Add(new CodeVariableDeclarationStatement(obj.GetType(), variableName, new CodeObjectCreateExpression(obj.GetType())));
|
|
|
|
foreach (string handle in handles)
|
|
statements.Add(new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodeVariableReferenceExpression(variableName), "Add"), new CodeExpression[] { new CodePrimitiveExpression(handle) }));
|
|
|
|
retVal = new CodeVariableReferenceExpression(variableName);
|
|
}
|
|
return retVal;
|
|
}
|
|
}
|
|
}
|