Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.Activities / System / Activities / XamlIntegration / TypeConverterBase.cs / 1305376 / TypeConverterBase.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.Activities.XamlIntegration { using System; using System.Collections.Concurrent; using System.ComponentModel; using System.Globalization; using System.Runtime; using System.Threading; using System.Xaml; public abstract class TypeConverterBase : TypeConverter { Lazy> helpers = new Lazy >(); TypeConverterHelper helper; Type baseType; Type helperType; internal TypeConverterBase(Type baseType, Type helperType) { this.baseType = baseType; this.helperType = helperType; } internal TypeConverterBase(Type targetType, Type baseType, Type helperType) { this.helper = GetTypeConverterHelper(targetType, baseType, helperType); } public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { if (sourceType == TypeHelper.StringType) { return true; } return base.CanConvertFrom(context, sourceType); } public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if (destinationType == TypeHelper.StringType) { return false; } return base.CanConvertTo(context, destinationType); } public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { string stringValue = value as string; if (stringValue != null) { TypeConverterHelper currentHelper = helper; if (currentHelper == null) { IDestinationTypeProvider targetService = context.GetService(typeof(IDestinationTypeProvider)) as IDestinationTypeProvider; Type targetType = targetService.GetDestinationType(); if (!this.helpers.Value.TryGetValue(targetType, out currentHelper)) { currentHelper = GetTypeConverterHelper(targetType, this.baseType, this.helperType); if (!this.helpers.Value.TryAdd(targetType, currentHelper)) { if (!this.helpers.Value.TryGetValue(targetType, out currentHelper)) { throw FxTrace.Exception.AsError(new InvalidOperationException(SR.TypeConverterHelperCacheAddFailed(targetType))); } } } } object result = currentHelper.UntypedConvertFromString(stringValue, context); return result; } return base.ConvertFrom(context, culture, value); } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { return base.ConvertTo(context, culture, value, destinationType); } TypeConverterHelper GetTypeConverterHelper(Type targetType, Type baseType, Type helperType) { Type[] genericTypeArguments; if (baseType.BaseType == targetType) { // support non-generic ActivityWithResult, In/Out/InOutArgument genericTypeArguments = new Type[] { TypeHelper.ObjectType }; } else { // Find baseType in the base class list of targetType while (!targetType.IsGenericType || !(targetType.GetGenericTypeDefinition() == baseType)) { if (targetType == TypeHelper.ObjectType) { throw FxTrace.Exception.AsError(new InvalidOperationException(SR.InvalidTypeConverterUsage)); } targetType = targetType.BaseType; } genericTypeArguments = targetType.GetGenericArguments(); } Type concreteHelperType = helperType.MakeGenericType(genericTypeArguments); return (TypeConverterHelper)Activator.CreateInstance(concreteHelperType); } internal abstract class TypeConverterHelper { public abstract object UntypedConvertFromString(string text, ITypeDescriptorContext context); public static T GetService (ITypeDescriptorContext context) where T : class { T service = (T)context.GetService(typeof(T)); if (service == null) { throw FxTrace.Exception.AsError(new InvalidOperationException(SR.InvalidTypeConverterUsage)); } return service; } } internal abstract class TypeConverterHelper : TypeConverterHelper { public abstract T ConvertFromString(string text, ITypeDescriptorContext context); public sealed override object UntypedConvertFromString(string text, ITypeDescriptorContext context) { return ConvertFromString(text, context); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SmuggledIUnknown.cs
- DataGridTablesFactory.cs
- SafeLibraryHandle.cs
- StringArrayConverter.cs
- SafeNativeMethods.cs
- TextElementCollectionHelper.cs
- PlatformNotSupportedException.cs
- SystemFonts.cs
- HtmlTableCellCollection.cs
- EncodingInfo.cs
- CreateUserErrorEventArgs.cs
- Int16Converter.cs
- DataGridViewBindingCompleteEventArgs.cs
- BooleanExpr.cs
- GeneralTransformCollection.cs
- ArraySortHelper.cs
- DaylightTime.cs
- NavigationExpr.cs
- StylusPointDescription.cs
- peernodestatemanager.cs
- ListItemParagraph.cs
- CodeDirectionExpression.cs
- QilFunction.cs
- ToRequest.cs
- sitestring.cs
- TrustLevel.cs
- ReachUIElementCollectionSerializerAsync.cs
- ServiceBusyException.cs
- PolyQuadraticBezierSegment.cs
- IisTraceWebEventProvider.cs
- ExpressionEditorAttribute.cs
- CodeAccessPermission.cs
- EntryPointNotFoundException.cs
- CodePageUtils.cs
- WebServiceClientProxyGenerator.cs
- RoleService.cs
- WebPartEditorCancelVerb.cs
- HelpPage.cs
- Pkcs7Signer.cs
- BamlRecords.cs
- FlowLayoutSettings.cs
- Baml2006ReaderFrame.cs
- AutoCompleteStringCollection.cs
- ObservableDictionary.cs
- IOThreadTimer.cs
- StringExpressionSet.cs
- Rights.cs
- ParagraphVisual.cs
- URL.cs
- WsatRegistrationHeader.cs
- WizardPanel.cs
- AddInPipelineAttributes.cs
- Domain.cs
- Error.cs
- SchemaImporterExtensionElement.cs
- RadioButtonRenderer.cs
- XmlReaderSettings.cs
- XmlNavigatorStack.cs
- CodeMemberProperty.cs
- HtmlTableCellCollection.cs
- Matrix3DValueSerializer.cs
- UnsafeNativeMethods.cs
- AsyncStreamReader.cs
- LoginName.cs
- DriveNotFoundException.cs
- OuterGlowBitmapEffect.cs
- MenuItemBindingCollection.cs
- DataGridViewRowCancelEventArgs.cs
- RsaSecurityKey.cs
- DescriptionAttribute.cs
- TaskHelper.cs
- Funcletizer.cs
- CustomWebEventKey.cs
- AssemblyContextControlItem.cs
- SQLGuidStorage.cs
- ProfileProvider.cs
- DecimalKeyFrameCollection.cs
- CorrelationManager.cs
- ShaderRenderModeValidation.cs
- SmtpMail.cs
- CodeValidator.cs
- Msmq3PoisonHandler.cs
- XmlQueryCardinality.cs
- EntityCommand.cs
- SvcFileManager.cs
- TimeSpanConverter.cs
- SettingsPropertyCollection.cs
- CodeGeneratorAttribute.cs
- ListViewItem.cs
- DefinitionUpdate.cs
- DBConnectionString.cs
- XmlCodeExporter.cs
- GridEntry.cs
- ServicePointManagerElement.cs
- XmlSchemaSimpleType.cs
- TableItemProviderWrapper.cs
- DownloadProgressEventArgs.cs
- TreeView.cs
- FixedSOMTextRun.cs
- Size3D.cs