Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / Microsoft / Scripting / Ast / MemberExpression.cs / 1305376 / MemberExpression.cs
/* **************************************************************************** * * Copyright (c) Microsoft Corporation. * * This source code is subject to terms and conditions of the Microsoft Public License. A * copy of the license can be found in the License.html file at the root of this distribution. If * you cannot locate the Microsoft Public License, please send an email to * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound * by the terms of the Microsoft Public License. * * You must not remove this notice, or any other, from this software. * * * ***************************************************************************/ using System.Diagnostics; using System.Dynamic.Utils; using System.Reflection; #if SILVERLIGHT using System.Core; #endif namespace System.Linq.Expressions { ////// Represents accessing a field or property. /// #if !SILVERLIGHT [DebuggerTypeProxy(typeof(Expression.MemberExpressionProxy))] #endif public class MemberExpression : Expression { private readonly Expression _expression; ////// Gets the field or property to be accessed. /// public MemberInfo Member { get { return GetMember(); } } ////// Gets the containing object of the field or property. /// public Expression Expression { get { return _expression; } } // param order: factories args in order, then other args internal MemberExpression(Expression expression) { _expression = expression; } internal static MemberExpression Make(Expression expression, MemberInfo member) { if (member.MemberType == MemberTypes.Field) { FieldInfo fi = (FieldInfo)member; return new FieldExpression(expression, fi); } else { PropertyInfo pi = (PropertyInfo)member; return new PropertyExpression(expression, pi); } } ////// Returns the node type of this ///. (Inherited from .) /// The public sealed override ExpressionType NodeType { get { return ExpressionType.MemberAccess; } } internal virtual MemberInfo GetMember() { throw ContractUtils.Unreachable; } ///that represents this expression. /// Dispatches to the specific visit method for this node type. /// protected internal override Expression Accept(ExpressionVisitor visitor) { return visitor.VisitMember(this); } ////// Creates a new expression that is like this one, but using the /// supplied children. If all of the children are the same, it will /// return this expression. /// /// Theproperty of the result. /// This expression if no children changed, or an expression with the updated children. public MemberExpression Update(Expression expression) { if (expression == Expression) { return this; } return Expression.MakeMemberAccess(expression, Member); } } internal class FieldExpression : MemberExpression { private readonly FieldInfo _field; public FieldExpression(Expression expression, FieldInfo member) : base(expression) { _field = member; } internal override MemberInfo GetMember() { return _field; } public sealed override Type Type { get { return _field.FieldType; } } } internal class PropertyExpression : MemberExpression { private readonly PropertyInfo _property; public PropertyExpression(Expression expression, PropertyInfo member) : base(expression) { _property = member; } internal override MemberInfo GetMember() { return _property; } public sealed override Type Type { get { return _property.PropertyType; } } } public partial class Expression { #region Field ////// Creates a /// The containing object of the field. This can be null for static fields. /// The field to be accessed. ///accessing a field. /// The created [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1719:ParameterNamesShouldNotMatchMemberNames")] public static MemberExpression Field(Expression expression, FieldInfo field) { ContractUtils.RequiresNotNull(field, "field"); if (field.IsStatic) { if (expression != null) throw new ArgumentException(Strings.OnlyStaticFieldsHaveNullInstance, "expression"); } else { if (expression == null) throw new ArgumentException(Strings.OnlyStaticFieldsHaveNullInstance, "field"); RequiresCanRead(expression, "expression"); if (!TypeUtils.AreReferenceAssignable(field.DeclaringType, expression.Type)) { throw Error.FieldInfoNotDefinedForType(field.DeclaringType, field.Name, expression.Type); } } return MemberExpression.Make(expression, field); } ///. /// Creates a /// The containing object of the field. This can be null for static fields. /// The field to be accessed. ///accessing a field. /// The created public static MemberExpression Field(Expression expression, string fieldName) { RequiresCanRead(expression, "expression"); // bind to public names first FieldInfo fi = expression.Type.GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); if (fi == null) { fi = expression.Type.GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); } if (fi == null) { throw Error.InstanceFieldNotDefinedForType(fieldName, expression.Type); } return Expression.Field(expression, fi); } ///. /// Creates a /// The containing object of the field. This can be null for static fields. /// Theaccessing a field. /// containing the field. /// The field to be accessed. /// The created [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1719:ParameterNamesShouldNotMatchMemberNames")] public static MemberExpression Field(Expression expression, Type type, string fieldName) { ContractUtils.RequiresNotNull(type, "type"); // bind to public names first FieldInfo fi = type.GetField(fieldName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); if (fi == null) { fi = type.GetField(fieldName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); } if (fi == null) { throw Error.FieldNotDefinedForType(fieldName, type); } return Expression.Field(expression, fi); } #endregion #region Property ///. /// Creates a /// The containing object of the property. This can be null for static properties. /// The property to be accessed. ///accessing a property. /// The created public static MemberExpression Property(Expression expression, string propertyName) { RequiresCanRead(expression, "expression"); ContractUtils.RequiresNotNull(propertyName, "propertyName"); // bind to public names first PropertyInfo pi = expression.Type.GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); if (pi == null) { pi = expression.Type.GetProperty(propertyName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); } if (pi == null) { throw Error.InstancePropertyNotDefinedForType(propertyName, expression.Type); } return Property(expression, pi); } ///. /// Creates a /// The containing object of the property. This can be null for static properties. /// Theaccessing a property. /// containing the property. /// The property to be accessed. /// The created public static MemberExpression Property(Expression expression, Type type, string propertyName) { ContractUtils.RequiresNotNull(type, "type"); ContractUtils.RequiresNotNull(propertyName, "propertyName"); // bind to public names first PropertyInfo pi = type.GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); if (pi == null) { pi = type.GetProperty(propertyName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); } if (pi == null) { throw Error.PropertyNotDefinedForType(propertyName, type); } return Property(expression, pi); } ///. /// Creates a /// The containing object of the property. This can be null for static properties. /// The property to be accessed. ///accessing a property. /// The created [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1719:ParameterNamesShouldNotMatchMemberNames")] public static MemberExpression Property(Expression expression, PropertyInfo property) { ContractUtils.RequiresNotNull(property, "property"); MethodInfo mi = property.GetGetMethod(true) ?? property.GetSetMethod(true); if (mi == null) { throw Error.PropertyDoesNotHaveAccessor(property); } if (mi.IsStatic) { if (expression != null) throw new ArgumentException(Strings.OnlyStaticPropertiesHaveNullInstance, "expression"); } else { if (expression == null) throw new ArgumentException(Strings.OnlyStaticPropertiesHaveNullInstance, "property"); RequiresCanRead(expression, "expression"); if (!TypeUtils.IsValidInstanceType(property, expression.Type)) { throw Error.PropertyNotDefinedForType(property, expression.Type); } } return MemberExpression.Make(expression, property); } ///. /// Creates a /// The containing object of the property. This can be null for static properties. /// An accessor method of the property to be accessed. ///accessing a property. /// The created public static MemberExpression Property(Expression expression, MethodInfo propertyAccessor) { ContractUtils.RequiresNotNull(propertyAccessor, "propertyAccessor"); ValidateMethodInfo(propertyAccessor); return Property(expression, GetProperty(propertyAccessor)); } private static PropertyInfo GetProperty(MethodInfo mi) { Type type = mi.DeclaringType; BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic; flags |= (mi.IsStatic) ? BindingFlags.Static : BindingFlags.Instance; PropertyInfo[] props = type.GetProperties(flags); foreach (PropertyInfo pi in props) { if (pi.CanRead && CheckMethod(mi, pi.GetGetMethod(true))) { return pi; } if (pi.CanWrite && CheckMethod(mi, pi.GetSetMethod(true))) { return pi; } } throw Error.MethodNotPropertyAccessor(mi.DeclaringType, mi.Name); } private static bool CheckMethod(MethodInfo method, MethodInfo propertyMethod) { if (method == propertyMethod) { return true; } // If the type is an interface then the handle for the method got by the compiler will not be the // same as that returned by reflection. // Check for this condition and try and get the method from reflection. Type type = method.DeclaringType; if (type.IsInterface && method.Name == propertyMethod.Name && type.GetMethod(method.Name) == propertyMethod) { return true; } return false; } #endregion ///. /// Creates a /// The containing object of the member. This can be null for static members. /// The member to be accessed. ///accessing a property or field. /// The created public static MemberExpression PropertyOrField(Expression expression, string propertyOrFieldName) { RequiresCanRead(expression, "expression"); // bind to public names first PropertyInfo pi = expression.Type.GetProperty(propertyOrFieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); if (pi != null) return Property(expression, pi); FieldInfo fi = expression.Type.GetField(propertyOrFieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); if (fi != null) return Field(expression, fi); pi = expression.Type.GetProperty(propertyOrFieldName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); if (pi != null) return Property(expression, pi); fi = expression.Type.GetField(propertyOrFieldName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); if (fi != null) return Field(expression, fi); throw Error.NotAMemberOfType(propertyOrFieldName, expression.Type); } ///. /// Creates a /// The containing object of the member. This can be null for static members. /// The member to be accessed. ///accessing a property or field. /// The created public static MemberExpression MakeMemberAccess(Expression expression, MemberInfo member) { ContractUtils.RequiresNotNull(member, "member"); FieldInfo fi = member as FieldInfo; if (fi != null) { return Expression.Field(expression, fi); } PropertyInfo pi = member as PropertyInfo; if (pi != null) { return Expression.Property(expression, pi); } throw Error.MemberNotFieldOrProperty(member); } } } // 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
- FormViewCommandEventArgs.cs
- BinaryConverter.cs
- DictionaryBase.cs
- SignalGate.cs
- FormattedText.cs
- UseAttributeSetsAction.cs
- DataObjectMethodAttribute.cs
- Selection.cs
- ActivityDesignerLayoutSerializers.cs
- ValidationHelper.cs
- ConfigurationLocationCollection.cs
- CreateUserWizardStep.cs
- MetadataCache.cs
- SqlDataReaderSmi.cs
- Function.cs
- SizeLimitedCache.cs
- DropDownList.cs
- UDPClient.cs
- HybridObjectCache.cs
- TextSpanModifier.cs
- WebBrowser.cs
- PenContexts.cs
- ProvideValueServiceProvider.cs
- ProcessingInstructionAction.cs
- ResumeStoryboard.cs
- BindStream.cs
- ClearTypeHintValidation.cs
- BufferAllocator.cs
- ModelItemDictionary.cs
- BaseDataListPage.cs
- SecurityCriticalDataForSet.cs
- Assert.cs
- ComboBox.cs
- BamlBinaryWriter.cs
- DataGridSortCommandEventArgs.cs
- XPathConvert.cs
- MatchingStyle.cs
- Matrix3DConverter.cs
- HttpSocketManager.cs
- RangeValueProviderWrapper.cs
- MinMaxParagraphWidth.cs
- PeerPresenceInfo.cs
- HttpCapabilitiesEvaluator.cs
- AmbientProperties.cs
- QueryGeneratorBase.cs
- ContextMenuService.cs
- SamlNameIdentifierClaimResource.cs
- RoleService.cs
- OdbcException.cs
- DrawListViewColumnHeaderEventArgs.cs
- RefExpr.cs
- PropertyConverter.cs
- DataGridViewCellStyle.cs
- Matrix.cs
- Vector.cs
- MouseDevice.cs
- ParamArrayAttribute.cs
- NestedContainer.cs
- MarkerProperties.cs
- StaticFileHandler.cs
- XmlDesigner.cs
- AssemblyInfo.cs
- Fx.cs
- SimpleApplicationHost.cs
- RuntimeConfigLKG.cs
- Module.cs
- ValidatorCollection.cs
- OdbcDataAdapter.cs
- WindowHideOrCloseTracker.cs
- TextBlock.cs
- basevalidator.cs
- FixedSOMTextRun.cs
- ZipIORawDataFileBlock.cs
- DispatchWrapper.cs
- KeysConverter.cs
- PointLight.cs
- CacheAxisQuery.cs
- SqlDependency.cs
- HttpConfigurationSystem.cs
- FloaterBaseParaClient.cs
- MailWebEventProvider.cs
- XmlHelper.cs
- EditModeSwitchButton.cs
- ObjectDataSourceMethodEditor.cs
- ReadOnlyPropertyMetadata.cs
- MultipleViewPattern.cs
- RowBinding.cs
- Hex.cs
- ActiveDocumentEvent.cs
- ToolBarButtonClickEvent.cs
- CustomPopupPlacement.cs
- CodeMethodInvokeExpression.cs
- DataKeyCollection.cs
- SafeCoTaskMem.cs
- TreeChangeInfo.cs
- RowSpanVector.cs
- SoapServerProtocol.cs
- COM2ExtendedUITypeEditor.cs
- EncoderNLS.cs
- ToolboxCategoryItems.cs