Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Common / AuthoringOM / Serializer / CodeTypeReferenceSerializer.cs / 1305376 / CodeTypeReferenceSerializer.cs
using System;
using System.CodeDom;
using System.Text;
using System.Workflow.ComponentModel.Compiler;
using System.Globalization;
namespace System.Workflow.ComponentModel.Serialization
{
///
/// This class serializes and deserializes CodeTypeReference objects used by rules.
/// It saves the AssemblyQualifiedName, so that the type can be loaded if the assembly is not
/// previously loaded at run-time.
///
internal sealed class CodeTypeReferenceSerializer : WorkflowMarkupSerializer
{
// this must match the name used by rules (RuleUserDataKeys.QualifiedName)
internal const string QualifiedName = "QualifiedName";
protected internal override bool CanSerializeToString(WorkflowMarkupSerializationManager serializationManager, object value)
{
return (value is CodeTypeReference);
}
protected internal override string SerializeToString(WorkflowMarkupSerializationManager serializationManager, object value)
{
if (serializationManager == null)
throw new ArgumentNullException("serializationManager");
if (value == null)
throw new ArgumentNullException("value");
CodeTypeReference reference = value as CodeTypeReference;
if (reference == null)
return string.Empty;
// make the typename as best we can, and try to get the fully qualified name
// if a type is used in an assembly not referenced, GetType will complain
string typeName = ConvertTypeReferenceToString(reference);
Type type = serializationManager.GetType(typeName);
if (type == null)
{
// TypeProvider can't find it, see if it's a common type in mscorlib
type = Type.GetType(typeName, false);
if (type == null)
{
// still no luck finding it, so simply save the name without assembly information
// this is equivalent to what happened before
return typeName;
}
}
//
// If we get a real type make sure that we get the correct fully qualified name for the target framework version
string assemblyFullName = null;
TypeProvider typeProvider = serializationManager.GetService(typeof(ITypeProvider)) as TypeProvider;
if (typeProvider != null)
{
assemblyFullName = typeProvider.GetAssemblyName(type);
}
//
// If we didn't find an assembly value it is either a local type or something is wrong
// However per the general guidance on multi-targeting it is up to the caller
// to make sure that writers (such as Xoml) are given types that exist in the target framework
// This makes it the job of the rules designer or rules validator to not call the Xoml stack
// with types that do not exist in the target framework
if (string.IsNullOrEmpty(assemblyFullName))
{
typeName = type.AssemblyQualifiedName;
}
else
{
typeName = string.Format(CultureInfo.InvariantCulture, "{0}, {1}", type.FullName, assemblyFullName);
}
return typeName;
}
protected internal override object DeserializeFromString(WorkflowMarkupSerializationManager serializationManager, Type propertyType, string value)
{
if (!propertyType.IsAssignableFrom(typeof(CodeTypeReference)))
return null;
// if the string is empty or markup extension,
// then the object is null
if (string.IsNullOrEmpty(value) || IsValidCompactAttributeFormat(value))
return null;
// value is the fully qualified name of the type
// however, it may refer to non-existant assemblies, so we may get an error
CodeTypeReference result;
try
{
Type type = serializationManager.GetType(value);
if (type != null)
{
result = new CodeTypeReference(type);
result.UserData[QualifiedName] = type.AssemblyQualifiedName;
return result;
}
}
catch (Exception)
{
// something went wrong getting the type, so simply pass in the string and
// let CodeTypeReference figure it out. Note that CodeTypeReference has a method
// RipOffAssemblyInformationFromTypeName, so assembly names are ignored.
}
result = new CodeTypeReference(value);
result.UserData[QualifiedName] = value;
return result;
}
private static string ConvertTypeReferenceToString(CodeTypeReference reference)
{
// CodeTypeReferences are nested structures that represent a type.
// This code converts one into a string that GetType() should like.
StringBuilder result;
if (reference.ArrayElementType != null)
{
// type represents an array
result = new StringBuilder(ConvertTypeReferenceToString(reference.ArrayElementType));
if (reference.ArrayRank > 0)
{
result.Append("[");
result.Append(',', reference.ArrayRank - 1);
result.Append("]");
}
}
else
{
// type is not an array, but may have type arguments
result = new StringBuilder(reference.BaseType);
if ((reference.TypeArguments != null) && (reference.TypeArguments.Count > 0))
{
string prefix = "[";
foreach (CodeTypeReference nested in reference.TypeArguments)
{
result.Append(prefix);
result.Append(ConvertTypeReferenceToString(nested));
prefix = ", ";
}
result.Append("]");
}
}
return result.ToString();
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
using System;
using System.CodeDom;
using System.Text;
using System.Workflow.ComponentModel.Compiler;
using System.Globalization;
namespace System.Workflow.ComponentModel.Serialization
{
///
/// This class serializes and deserializes CodeTypeReference objects used by rules.
/// It saves the AssemblyQualifiedName, so that the type can be loaded if the assembly is not
/// previously loaded at run-time.
///
internal sealed class CodeTypeReferenceSerializer : WorkflowMarkupSerializer
{
// this must match the name used by rules (RuleUserDataKeys.QualifiedName)
internal const string QualifiedName = "QualifiedName";
protected internal override bool CanSerializeToString(WorkflowMarkupSerializationManager serializationManager, object value)
{
return (value is CodeTypeReference);
}
protected internal override string SerializeToString(WorkflowMarkupSerializationManager serializationManager, object value)
{
if (serializationManager == null)
throw new ArgumentNullException("serializationManager");
if (value == null)
throw new ArgumentNullException("value");
CodeTypeReference reference = value as CodeTypeReference;
if (reference == null)
return string.Empty;
// make the typename as best we can, and try to get the fully qualified name
// if a type is used in an assembly not referenced, GetType will complain
string typeName = ConvertTypeReferenceToString(reference);
Type type = serializationManager.GetType(typeName);
if (type == null)
{
// TypeProvider can't find it, see if it's a common type in mscorlib
type = Type.GetType(typeName, false);
if (type == null)
{
// still no luck finding it, so simply save the name without assembly information
// this is equivalent to what happened before
return typeName;
}
}
//
// If we get a real type make sure that we get the correct fully qualified name for the target framework version
string assemblyFullName = null;
TypeProvider typeProvider = serializationManager.GetService(typeof(ITypeProvider)) as TypeProvider;
if (typeProvider != null)
{
assemblyFullName = typeProvider.GetAssemblyName(type);
}
//
// If we didn't find an assembly value it is either a local type or something is wrong
// However per the general guidance on multi-targeting it is up to the caller
// to make sure that writers (such as Xoml) are given types that exist in the target framework
// This makes it the job of the rules designer or rules validator to not call the Xoml stack
// with types that do not exist in the target framework
if (string.IsNullOrEmpty(assemblyFullName))
{
typeName = type.AssemblyQualifiedName;
}
else
{
typeName = string.Format(CultureInfo.InvariantCulture, "{0}, {1}", type.FullName, assemblyFullName);
}
return typeName;
}
protected internal override object DeserializeFromString(WorkflowMarkupSerializationManager serializationManager, Type propertyType, string value)
{
if (!propertyType.IsAssignableFrom(typeof(CodeTypeReference)))
return null;
// if the string is empty or markup extension,
// then the object is null
if (string.IsNullOrEmpty(value) || IsValidCompactAttributeFormat(value))
return null;
// value is the fully qualified name of the type
// however, it may refer to non-existant assemblies, so we may get an error
CodeTypeReference result;
try
{
Type type = serializationManager.GetType(value);
if (type != null)
{
result = new CodeTypeReference(type);
result.UserData[QualifiedName] = type.AssemblyQualifiedName;
return result;
}
}
catch (Exception)
{
// something went wrong getting the type, so simply pass in the string and
// let CodeTypeReference figure it out. Note that CodeTypeReference has a method
// RipOffAssemblyInformationFromTypeName, so assembly names are ignored.
}
result = new CodeTypeReference(value);
result.UserData[QualifiedName] = value;
return result;
}
private static string ConvertTypeReferenceToString(CodeTypeReference reference)
{
// CodeTypeReferences are nested structures that represent a type.
// This code converts one into a string that GetType() should like.
StringBuilder result;
if (reference.ArrayElementType != null)
{
// type represents an array
result = new StringBuilder(ConvertTypeReferenceToString(reference.ArrayElementType));
if (reference.ArrayRank > 0)
{
result.Append("[");
result.Append(',', reference.ArrayRank - 1);
result.Append("]");
}
}
else
{
// type is not an array, but may have type arguments
result = new StringBuilder(reference.BaseType);
if ((reference.TypeArguments != null) && (reference.TypeArguments.Count > 0))
{
string prefix = "[";
foreach (CodeTypeReference nested in reference.TypeArguments)
{
result.Append(prefix);
result.Append(ConvertTypeReferenceToString(nested));
prefix = ", ";
}
result.Append("]");
}
}
return result.ToString();
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- EntityWithChangeTrackerStrategy.cs
- CodeDirectoryCompiler.cs
- TextTreeDeleteContentUndoUnit.cs
- QilPatternFactory.cs
- AssemblyCache.cs
- SmiRequestExecutor.cs
- Terminate.cs
- ListViewInsertionMark.cs
- isolationinterop.cs
- SqlParameterCollection.cs
- TextTreeDeleteContentUndoUnit.cs
- ElasticEase.cs
- EditBehavior.cs
- WebException.cs
- TreeChangeInfo.cs
- HttpApplication.cs
- Typeface.cs
- DBSqlParserColumn.cs
- DispatcherProcessingDisabled.cs
- OracleLob.cs
- HtmlInputButton.cs
- VariableQuery.cs
- ParameterElement.cs
- TypeTypeConverter.cs
- AggregateNode.cs
- TabletDeviceInfo.cs
- CodeTryCatchFinallyStatement.cs
- ImageSourceConverter.cs
- ConfigurationSectionGroupCollection.cs
- DecimalAnimationUsingKeyFrames.cs
- TemplateBuilder.cs
- XmlSerializerFactory.cs
- CheckBoxList.cs
- ButtonChrome.cs
- SafeRegistryHandle.cs
- HandlerMappingMemo.cs
- FrameDimension.cs
- InputMethodStateTypeInfo.cs
- SchemaAttDef.cs
- DesignerGenericWebPart.cs
- PrintControllerWithStatusDialog.cs
- RayHitTestParameters.cs
- HtmlTableCellCollection.cs
- LeaseManager.cs
- Button.cs
- CaseInsensitiveHashCodeProvider.cs
- SoapIgnoreAttribute.cs
- XmlCharType.cs
- TypefaceMap.cs
- StructuredTypeInfo.cs
- RecordsAffectedEventArgs.cs
- documentsequencetextpointer.cs
- WorkflowMarkupSerializationProvider.cs
- SolidBrush.cs
- KeyProperty.cs
- MessageQueueException.cs
- ETagAttribute.cs
- ListBoxItemWrapperAutomationPeer.cs
- SharedUtils.cs
- TableRowGroup.cs
- Permission.cs
- Font.cs
- ListenerElementsCollection.cs
- AstNode.cs
- SimpleHandlerFactory.cs
- CodeCompiler.cs
- OperandQuery.cs
- SrgsRuleRef.cs
- SemanticAnalyzer.cs
- PassportAuthenticationModule.cs
- RealProxy.cs
- TypeElement.cs
- QilVisitor.cs
- IntSecurity.cs
- ProjectionPruner.cs
- ConstructorBuilder.cs
- mediapermission.cs
- LinkConverter.cs
- SyndicationDeserializer.cs
- StreamUpdate.cs
- nulltextnavigator.cs
- ScalarConstant.cs
- Properties.cs
- Filter.cs
- RestClientProxyHandler.cs
- StreamMarshaler.cs
- Style.cs
- ScrollItemProviderWrapper.cs
- DebugControllerThread.cs
- SplitContainer.cs
- StorageModelBuildProvider.cs
- SecurityTokenSerializer.cs
- LogStore.cs
- LabelDesigner.cs
- SecurityPolicySection.cs
- TransformerInfoCollection.cs
- OdbcParameter.cs
- HostSecurityManager.cs
- cookieexception.cs
- Drawing.cs