Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / clr / src / BCL / System / OleAutBinder.cs / 1 / OleAutBinder.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // This class represents the Ole Automation binder. // #define DISPLAY_DEBUG_INFO namespace System { using System; using System.Runtime.InteropServices; using System.Reflection; using Microsoft.Win32; using CultureInfo = System.Globalization.CultureInfo; // Made serializable in anticipation of this class eventually having state. [Serializable()] internal class OleAutBinder : DefaultBinder { // ChangeType // This binder uses OLEAUT to change the type of the variant. public override Object ChangeType(Object value, Type type, CultureInfo cultureInfo) { Variant myValue = new Variant(value); if (cultureInfo == null) cultureInfo = CultureInfo.CurrentCulture; #if DISPLAY_DEBUG_INFO Console.Write("In OleAutBinder::ChangeType converting variant of type: "); Console.Write(myValue.VariantType); Console.Write(" to type: "); Console.WriteLine(type.Name); #endif if (type.IsByRef) { #if DISPLAY_DEBUG_INFO Console.WriteLine("Striping byref from the type to convert to."); #endif type = type.GetElementType(); } // If we are trying to convert from an object to another type then we don't // need the OLEAUT change type, we can just use the normal COM+ mechanisms. if (!type.IsPrimitive && type.IsInstanceOfType(value)) { #if DISPLAY_DEBUG_INFO Console.WriteLine("Source variant can be assigned to destination type"); #endif return value; } Type srcType = value.GetType(); // Handle converting primitives to enums. if (type.IsEnum && srcType.IsPrimitive) { #if DISPLAY_DEBUG_INFO Console.WriteLine("Converting primitive to enum"); #endif return Enum.Parse(type, value.ToString()); } // Special case the convertion from DBNull. if (srcType == typeof(DBNull)) { // The requested type is a DBNull so no convertion is required. if (type == typeof(DBNull)) return value; // Visual J++ supported converting from DBNull to null so customers // have requested (via a CDCR) that DBNull be convertible to null. // We don't however allow this when converting to a value class, since null // doesn't make sense for these, or to object since this would change existing // semantics. if ((type.IsClass && type != typeof(Object)) || type.IsInterface) return null; } #if FEATURE_COMINTEROP // Use the OA variant lib to convert primitive types. try { #if DISPLAY_DEBUG_INFO Console.WriteLine("Using OAVariantLib.ChangeType() to do the conversion"); #endif // Specify the LocalBool flag to have BOOL values converted to local language rather // than 0 or -1. Object RetObj = OAVariantLib.ChangeType(myValue, type, OAVariantLib.LocalBool, cultureInfo).ToObject(); #if DISPLAY_DEBUG_INFO Console.WriteLine("Object returned from ChangeType is of type: " + RetObj.GetType().Name); #endif return RetObj; } #if DISPLAY_DEBUG_INFO catch(NotSupportedException e) #else catch(NotSupportedException) #endif { #if DISPLAY_DEBUG_INFO Console.Write("Exception thrown: "); Console.WriteLine(e); #endif throw new COMException(Environment.GetResourceString("Interop.COM_TypeMismatch"), unchecked((int)0x80020005)); } #else // !FEATURE_COMINTEROP return base.ChangeType(value, type, cultureInfo); #endif // !FEATURE_COMINTEROP } #if !FEATURE_COMINTEROP // CanChangeType public override bool CanChangeType(Object value, Type type, CultureInfo cultureInfo) { Variant myValue = new Variant(value); if (cultureInfo == null) cultureInfo = CultureInfo.CurrentCulture; #if DISPLAY_DEBUG_INFO Console.Write("In OleAutBinder::CanChangeType converting variant of type: "); Console.Write(myValue.VariantType); Console.Write(" to type: "); Console.WriteLine(type.Name); #endif // If we are trying to convert to variant then there is nothing to do. if (type == typeof(Variant)) { #if DISPLAY_DEBUG_INFO Console.WriteLine("Variant being changed to type variant is always legal"); #endif return true; } if (type.IsByRef) { #if DISPLAY_DEBUG_INFO Console.WriteLine("Striping byref from the type to convert to."); #endif type = type.GetElementType(); } // If we are trying to convert from an object to another type then we don't // need the OLEAUT change type, we can just use the normal COM+ mechanisms. if (!type.IsPrimitive && type.IsInstanceOfType(value)) { #if DISPLAY_DEBUG_INFO Console.WriteLine("Source variant can be assigned to destination type"); #endif return true; } // Handle converting primitives to enums. if (type.IsEnum && value.GetType().IsPrimitive) { #if DISPLAY_DEBUG_INFO Console.WriteLine("Converting primitive to enum"); #endif return true; } return base.CanChangeType(value, type, cultureInfo); } #endif // FEATURE_COMINTEROP } }
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- MenuBase.cs
- DataRecordInternal.cs
- ProfessionalColorTable.cs
- ResourceCodeDomSerializer.cs
- XmlIgnoreAttribute.cs
- LocalizableAttribute.cs
- Annotation.cs
- XMLUtil.cs
- _NativeSSPI.cs
- XmlMtomWriter.cs
- SingleStorage.cs
- UnsafeNativeMethodsPenimc.cs
- NativeWindow.cs
- LambdaCompiler.Unary.cs
- TemplateColumn.cs
- CalculatedColumn.cs
- ProcessRequestArgs.cs
- EntityDataSourceChangingEventArgs.cs
- Label.cs
- DesignTimeParseData.cs
- DataTableNameHandler.cs
- DeploymentSectionCache.cs
- bindurihelper.cs
- RestHandler.cs
- Sql8ExpressionRewriter.cs
- InvokeMemberBinder.cs
- RIPEMD160.cs
- PathGeometry.cs
- PointValueSerializer.cs
- ChangesetResponse.cs
- DocumentPageHost.cs
- OleDbErrorCollection.cs
- StringToken.cs
- ControllableStoryboardAction.cs
- Expander.cs
- TypeExtensionSerializer.cs
- PageTheme.cs
- ProvidersHelper.cs
- VisualStateManager.cs
- OdbcConnectionOpen.cs
- GroupStyle.cs
- CodeGenerator.cs
- OracleTransaction.cs
- EnglishPluralizationService.cs
- StringInfo.cs
- VisualBrush.cs
- ProfileModule.cs
- CodeDefaultValueExpression.cs
- StyleCollectionEditor.cs
- ApplicationFileParser.cs
- RowToParametersTransformer.cs
- _BasicClient.cs
- SessionStateContainer.cs
- OdbcStatementHandle.cs
- ParseChildrenAsPropertiesAttribute.cs
- Int64Animation.cs
- KeyedByTypeCollection.cs
- DirtyTextRange.cs
- PriorityQueue.cs
- DesignerDataStoredProcedure.cs
- ConfigurationSchemaErrors.cs
- WindowsEditBoxRange.cs
- XmlBindingWorker.cs
- PageContentCollection.cs
- WinCategoryAttribute.cs
- WebPartVerbsEventArgs.cs
- BitSet.cs
- ProtocolsConfiguration.cs
- RequestCacheValidator.cs
- ChtmlTextBoxAdapter.cs
- SoapHttpTransportImporter.cs
- ValidationErrorEventArgs.cs
- FilterQuery.cs
- DataGridViewDataErrorEventArgs.cs
- SqlServices.cs
- EnumerableWrapperWeakToStrong.cs
- ExpandCollapsePattern.cs
- EntityDescriptor.cs
- DataViewManagerListItemTypeDescriptor.cs
- ViewBase.cs
- Mutex.cs
- SettingsAttributeDictionary.cs
- DataBoundControlAdapter.cs
- selecteditemcollection.cs
- DataServicePagingProviderWrapper.cs
- DataPagerFieldItem.cs
- AspCompat.cs
- TextBreakpoint.cs
- RenderData.cs
- TcpTransportBindingElement.cs
- AsymmetricSecurityProtocolFactory.cs
- DesignerTransactionCloseEvent.cs
- WindowsFormsLinkLabel.cs
- TableLayoutPanelCellPosition.cs
- ValueHandle.cs
- serverconfig.cs
- WebPartTracker.cs
- InputLanguageEventArgs.cs
- DataGridTablesFactory.cs
- ObfuscationAttribute.cs