Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / wpf / src / Base / MS / Internal / ComponentModel / AttachedPropertyMethodSelector.cs / 1 / AttachedPropertyMethodSelector.cs
namespace MS.Internal.ComponentModel
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.Reflection;
using System.Security.Permissions;
using System.Windows;
///
/// This is a reflection binder that is used to
/// find the right method match for attached properties.
/// The default binder in the CLR will not find a
/// method match unless the parameters we provide are
/// exact matches. This binder will use compatible type
/// matching to find a match for any parameters that are
/// compatible.
///
internal class AttachedPropertyMethodSelector : Binder
{
///
/// The only method we implement. Our goal here is to find a method that best matches the arguments passed.
/// We are doing this only with the intent of pulling attached property metadata off of the method.
/// If there are ambiguous methods, we simply take the first one as all "Get" methods for an attached
/// property should have identical metadata.
///
public override MethodBase SelectMethod(BindingFlags bindingAttr, MethodBase[] match, Type[] types, ParameterModifier[] modifiers)
{
// Short circuit for cases where someone didn't pass in a types array.
if (types == null)
{
if (match.Length > 1)
{
throw new AmbiguousMatchException();
}
else
{
return match[0];
}
}
for(int idx = 0; idx < match.Length; idx++)
{
MethodBase candidate = match[idx];
ParameterInfo[] parameters = candidate.GetParameters();
if (ParametersMatch(parameters, types))
{
return candidate;
}
}
return null;
}
///
/// This method checks that the parameters passed in are
/// compatible with the provided parameter types.
///
private static bool ParametersMatch(ParameterInfo[] parameters, Type[] types)
{
if (parameters.Length != types.Length)
{
return false;
}
// IsAssignableFrom is not cheap. Do this in two passes.
// Our first pass checks for exact type matches. Only on
// the second pass do we do an IsAssignableFrom.
bool compat = true;
for(int idx = 0; idx < parameters.Length; idx++)
{
ParameterInfo p = parameters[idx];
Type t = types[idx];
if (p.ParameterType != t)
{
compat = false;
break;
}
}
if (compat)
{
return true;
}
// Second pass uses IsAssignableFrom to check for compatible types.
compat = true;
for(int idx = 0; idx < parameters.Length; idx++)
{
ParameterInfo p = parameters[idx];
Type t = types[idx];
if (!t.IsAssignableFrom(p.ParameterType))
{
compat = false;
break;
}
}
return compat;
}
///
/// We do not implement this.
///
public override MethodBase BindToMethod(BindingFlags bindingAttr, MethodBase[] match, ref object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] names, out object state)
{
// We are only a method binder.
throw new NotImplementedException();
}
///
/// We do not implement this.
///
public override FieldInfo BindToField(BindingFlags bindingAttr, FieldInfo[] match, object value, CultureInfo culture)
{
// We are only a method binder.
throw new NotImplementedException();
}
///
/// We do not implement this.
///
public override object ChangeType(object value, Type type, CultureInfo culture)
{
// We are only a method binder.
throw new NotImplementedException();
}
///
/// We do not implement this.
///
public override void ReorderArgumentArray(ref object[] args, object state)
{
// We are only a method binder.
throw new NotImplementedException();
}
///
/// We do not implement this.
///
public override PropertyInfo SelectProperty(BindingFlags bindingAttr, PropertyInfo[] match, Type returnType, Type[] indexes, ParameterModifier[] modifiers)
{
// We are only a method binder.
throw new NotImplementedException();
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
namespace MS.Internal.ComponentModel
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.Reflection;
using System.Security.Permissions;
using System.Windows;
///
/// This is a reflection binder that is used to
/// find the right method match for attached properties.
/// The default binder in the CLR will not find a
/// method match unless the parameters we provide are
/// exact matches. This binder will use compatible type
/// matching to find a match for any parameters that are
/// compatible.
///
internal class AttachedPropertyMethodSelector : Binder
{
///
/// The only method we implement. Our goal here is to find a method that best matches the arguments passed.
/// We are doing this only with the intent of pulling attached property metadata off of the method.
/// If there are ambiguous methods, we simply take the first one as all "Get" methods for an attached
/// property should have identical metadata.
///
public override MethodBase SelectMethod(BindingFlags bindingAttr, MethodBase[] match, Type[] types, ParameterModifier[] modifiers)
{
// Short circuit for cases where someone didn't pass in a types array.
if (types == null)
{
if (match.Length > 1)
{
throw new AmbiguousMatchException();
}
else
{
return match[0];
}
}
for(int idx = 0; idx < match.Length; idx++)
{
MethodBase candidate = match[idx];
ParameterInfo[] parameters = candidate.GetParameters();
if (ParametersMatch(parameters, types))
{
return candidate;
}
}
return null;
}
///
/// This method checks that the parameters passed in are
/// compatible with the provided parameter types.
///
private static bool ParametersMatch(ParameterInfo[] parameters, Type[] types)
{
if (parameters.Length != types.Length)
{
return false;
}
// IsAssignableFrom is not cheap. Do this in two passes.
// Our first pass checks for exact type matches. Only on
// the second pass do we do an IsAssignableFrom.
bool compat = true;
for(int idx = 0; idx < parameters.Length; idx++)
{
ParameterInfo p = parameters[idx];
Type t = types[idx];
if (p.ParameterType != t)
{
compat = false;
break;
}
}
if (compat)
{
return true;
}
// Second pass uses IsAssignableFrom to check for compatible types.
compat = true;
for(int idx = 0; idx < parameters.Length; idx++)
{
ParameterInfo p = parameters[idx];
Type t = types[idx];
if (!t.IsAssignableFrom(p.ParameterType))
{
compat = false;
break;
}
}
return compat;
}
///
/// We do not implement this.
///
public override MethodBase BindToMethod(BindingFlags bindingAttr, MethodBase[] match, ref object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] names, out object state)
{
// We are only a method binder.
throw new NotImplementedException();
}
///
/// We do not implement this.
///
public override FieldInfo BindToField(BindingFlags bindingAttr, FieldInfo[] match, object value, CultureInfo culture)
{
// We are only a method binder.
throw new NotImplementedException();
}
///
/// We do not implement this.
///
public override object ChangeType(object value, Type type, CultureInfo culture)
{
// We are only a method binder.
throw new NotImplementedException();
}
///
/// We do not implement this.
///
public override void ReorderArgumentArray(ref object[] args, object state)
{
// We are only a method binder.
throw new NotImplementedException();
}
///
/// We do not implement this.
///
public override PropertyInfo SelectProperty(BindingFlags bindingAttr, PropertyInfo[] match, Type returnType, Type[] indexes, ParameterModifier[] modifiers)
{
// We are only a method binder.
throw new NotImplementedException();
}
}
}
// 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
- _NestedMultipleAsyncResult.cs
- DBConnection.cs
- TemplateInstanceAttribute.cs
- HighlightComponent.cs
- FusionWrap.cs
- ToolboxItemCollection.cs
- Registry.cs
- RelationshipEnd.cs
- DBSqlParser.cs
- XmlSchemaSimpleType.cs
- PropertyEmitter.cs
- ConfigurationProperty.cs
- ToggleButtonAutomationPeer.cs
- _TransmitFileOverlappedAsyncResult.cs
- FixedSOMGroup.cs
- ObjectDataSourceSelectingEventArgs.cs
- Translator.cs
- RawUIStateInputReport.cs
- CharacterShapingProperties.cs
- SizeAnimationUsingKeyFrames.cs
- BinaryConverter.cs
- PageBreakRecord.cs
- ColumnPropertiesGroup.cs
- MatrixTransform.cs
- PrintPreviewControl.cs
- CodeTypeReferenceSerializer.cs
- ExportOptions.cs
- RectAnimationUsingKeyFrames.cs
- TranslateTransform.cs
- MatchAttribute.cs
- SchemaInfo.cs
- CreatingCookieEventArgs.cs
- HtmlToClrEventProxy.cs
- DeflateStream.cs
- HuffmanTree.cs
- ChannelManagerService.cs
- DataColumn.cs
- PnrpPermission.cs
- TriggerBase.cs
- ConvertersCollection.cs
- FunctionQuery.cs
- ChangeConflicts.cs
- StreamingContext.cs
- MetadataCache.cs
- AgileSafeNativeMemoryHandle.cs
- ConfigXmlAttribute.cs
- GraphicsPath.cs
- SessionStateUtil.cs
- TypeSemantics.cs
- TextTreeUndoUnit.cs
- DocumentPaginator.cs
- Token.cs
- MappingException.cs
- DataGridColumnCollection.cs
- XmlSchemaSimpleContent.cs
- ClientSettingsStore.cs
- FtpWebRequest.cs
- CompressedStack.cs
- Assert.cs
- UriTemplateTrieNode.cs
- ReliableSession.cs
- SchemaInfo.cs
- DriveInfo.cs
- Binding.cs
- WebHttpSecurityElement.cs
- SiteMapDataSource.cs
- DbParameterCollectionHelper.cs
- AccessedThroughPropertyAttribute.cs
- RepeatInfo.cs
- ProcessHostServerConfig.cs
- TraceUtility.cs
- GAC.cs
- validation.cs
- ScriptControl.cs
- TextElementEditingBehaviorAttribute.cs
- CacheMode.cs
- tooltip.cs
- SmiXetterAccessMap.cs
- InstanceOwner.cs
- TextAdaptor.cs
- MarkupProperty.cs
- SolidColorBrush.cs
- DesigntimeLicenseContextSerializer.cs
- ResourceDescriptionAttribute.cs
- WorkflowItemPresenter.cs
- UpdateRecord.cs
- ViewPort3D.cs
- sqlnorm.cs
- FontUnitConverter.cs
- ClosableStream.cs
- BatchParser.cs
- GridView.cs
- ValueType.cs
- RoutedEventConverter.cs
- RegexCapture.cs
- ImageKeyConverter.cs
- DeclaredTypeValidator.cs
- StructuredTypeInfo.cs
- MediaEntryAttribute.cs
- InvalidComObjectException.cs