Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / fx / src / WinForms / Managed / System / WinForms / ComponentModel / COM2Interop / COM2Enum.cs / 1 / COM2Enum.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Windows.Forms.ComponentModel.Com2Interop {
using System.ComponentModel;
using System.Diagnostics;
using System;
using System.Collections;
using Microsoft.Win32;
using System.Globalization;
///
///
/// This class mimics a clr enum that we can create at runtime.
/// It associates an array of names with an array of values and converts
/// between them.
///
/// A note here: we compare string values when looking for the value of an item.
/// Typically these aren't large lists and the perf is worth it. The reason stems
/// from IPerPropertyBrowsing, which supplies a list of names and a list of
/// variants to mimic enum functionality. If the actual property value is a DWORD,
/// which translates to VT_UI4, and they specify their values as VT_I4 (which is a common
/// mistake), they won't compare properly and values can't be updated.
/// By comparing strings, we avoid this problem and add flexiblity to the system.
///
internal class Com2Enum {
///
///
/// Our array of value string names
///
private string[] names;
///
///
/// Our values
///
private object[] values;
///
///
/// Our cached array of value.ToString()'s
///
private string[] stringValues;
///
///
/// Should we allow values besides what's in the listbox?
///
private bool allowUnknownValues;
///
///
/// Our one and only ctor
///
public Com2Enum(string[] names, object[] values, bool allowUnknownValues) {
this.allowUnknownValues = allowUnknownValues;
// these have to be null and the same length
if (names == null ||
values == null ||
names.Length != values.Length) {
throw new ArgumentException(SR.GetString(SR.COM2NamesAndValuesNotEqual));
}
PopulateArrays(names, values);
}
///
///
/// Can this enum be values other than the strict enum?
///
public bool IsStrictEnum {
get {
return !this.allowUnknownValues;
}
}
///
///
/// Retrieve a copy of the value array
///
public virtual object[] Values {
get {
return(object[])this.values.Clone();
}
}
///
///
/// Retrieve a copy of the nme array.
///
public virtual string[] Names {
get {
return(string[])this.names.Clone();
}
}
///
///
/// Associate a string to the appropriate value.
///
public virtual object FromString(string s) {
int bestMatch = -1;
for (int i = 0; i < stringValues.Length; i++) {
if (String.Compare(names[i], s, true, CultureInfo.InvariantCulture) == 0 ||
String.Compare(stringValues[i], s, true, CultureInfo.InvariantCulture) == 0) {
return values[i];
}
if (bestMatch == -1 && 0 == String.Compare(names[i], s, true, CultureInfo.InvariantCulture)) {
bestMatch = i;
}
}
if (bestMatch != -1) {
return values[bestMatch];
}
return allowUnknownValues ? s : null;
}
protected virtual void PopulateArrays(string[] names, object[] values) {
// setup our values...since we have to walk through
// them anyway to do the ToString, we just copy them here.
this.names = new string[names.Length];
this.stringValues = new string[names.Length];
this.values = new object[names.Length];
for (int i = 0; i < names.Length; i++) {
//Debug.WriteLine(names[i] + ": item " + i.ToString() + ",type=" + values[i].GetType().Name + ", value=" + values[i].ToString());
this.names[i] = names[i];
this.values[i] = values[i];
if (values[i] != null) {
this.stringValues[i] = values[i].ToString();
}
}
}
///
///
/// Retrieves the string name of a given value.
///
public virtual string ToString(object v) {
if (v != null) {
// in case this is a real enum...try to convert it.
//
if (values.Length > 0 && v.GetType() != values[0].GetType()) {
try {
v = Convert.ChangeType(v, values[0].GetType(), CultureInfo.InvariantCulture);
}
catch{
}
}
// we have to do this do compensate for small discrpencies
// in a lot of objects in COM2 (DWORD -> VT_IU4, value we get is VT_I4, which
// convert to Int32, UInt32 respectively
string strVal = v.ToString();
for (int i = 0; i < values.Length; i++) {
if (String.Compare(stringValues[i], strVal, true, CultureInfo.InvariantCulture) == 0) {
return names[i];
}
}
if (allowUnknownValues) {
return strVal;
}
}
return "";
}
}
}
// 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
- InputChannelAcceptor.cs
- DataPagerFieldItem.cs
- ApplicationGesture.cs
- SmtpFailedRecipientsException.cs
- InputGestureCollection.cs
- DataSourceExpressionCollection.cs
- CounterSampleCalculator.cs
- DataObject.cs
- Drawing.cs
- ColorTranslator.cs
- ListBoxItemWrapperAutomationPeer.cs
- MdImport.cs
- DynamicILGenerator.cs
- ComboBoxAutomationPeer.cs
- RbTree.cs
- DoWorkEventArgs.cs
- WebServiceClientProxyGenerator.cs
- WebMessageEncoderFactory.cs
- Light.cs
- ProviderManager.cs
- XPathSingletonIterator.cs
- ToggleButtonAutomationPeer.cs
- PropertyTabAttribute.cs
- Types.cs
- UnsafeNativeMethods.cs
- UmAlQuraCalendar.cs
- BrowserCapabilitiesFactory.cs
- SoapFormatter.cs
- PropertyMetadata.cs
- HierarchicalDataBoundControl.cs
- BitmapPalette.cs
- ConfigPathUtility.cs
- TextEndOfSegment.cs
- SerialErrors.cs
- Tile.cs
- TextEditorTables.cs
- FileAuthorizationModule.cs
- XmlConvert.cs
- RowToParametersTransformer.cs
- MessageLoggingElement.cs
- SingleTagSectionHandler.cs
- Mappings.cs
- WebControl.cs
- ImageList.cs
- CorePropertiesFilter.cs
- CatalogPart.cs
- SemaphoreFullException.cs
- Line.cs
- InkCollectionBehavior.cs
- XmlQueryRuntime.cs
- Baml6Assembly.cs
- XmlQualifiedName.cs
- DockPanel.cs
- HitTestWithGeometryDrawingContextWalker.cs
- BinaryCommonClasses.cs
- ResourcePool.cs
- TokenBasedSetEnumerator.cs
- WorkflowShape.cs
- DictionarySectionHandler.cs
- followingquery.cs
- SubMenuStyle.cs
- AnnotationService.cs
- LicenseManager.cs
- ColorConvertedBitmapExtension.cs
- FocusWithinProperty.cs
- DbConnectionPoolCounters.cs
- ResourceSetExpression.cs
- SymLanguageType.cs
- CellTreeNodeVisitors.cs
- XmlSerializationWriter.cs
- StringPropertyBuilder.cs
- Rect3D.cs
- CategoryNameCollection.cs
- RightsManagementEncryptionTransform.cs
- ApplicationHost.cs
- UriTemplateVariablePathSegment.cs
- Compensate.cs
- ClientOptions.cs
- DisplayNameAttribute.cs
- SqlConnectionString.cs
- DesignerActionMethodItem.cs
- CreateUserWizardStep.cs
- ContextMarshalException.cs
- ValidateNames.cs
- CommandConverter.cs
- AccessDataSource.cs
- Composition.cs
- SynchronizationLockException.cs
- RuntimeEnvironment.cs
- ArrayTypeMismatchException.cs
- XmlILModule.cs
- MessageQueuePermissionAttribute.cs
- KeyInstance.cs
- SignatureDescription.cs
- ResourcesChangeInfo.cs
- ServicePointManagerElement.cs
- TreeNode.cs
- QilInvokeEarlyBound.cs
- Style.cs
- DashStyles.cs