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
- MobileFormsAuthentication.cs
- ExpressionNode.cs
- FontFamily.cs
- DefaultPropertiesToSend.cs
- ProfilePropertyNameValidator.cs
- SystemInfo.cs
- CollectionBuilder.cs
- DataServiceExpressionVisitor.cs
- XPathItem.cs
- BuildManagerHost.cs
- ListSortDescription.cs
- Atom10ItemFormatter.cs
- UnSafeCharBuffer.cs
- WebPart.cs
- NameObjectCollectionBase.cs
- Light.cs
- WmlObjectListAdapter.cs
- TextDecorationCollectionConverter.cs
- SystemWebCachingSectionGroup.cs
- XmlSerializerObjectSerializer.cs
- DrawingContextWalker.cs
- SafeSecurityHelper.cs
- TryCatch.cs
- Grant.cs
- PackUriHelper.cs
- NavigateEvent.cs
- SecureUICommand.cs
- SelectionManager.cs
- VirtualizingStackPanel.cs
- FeatureSupport.cs
- StylusCaptureWithinProperty.cs
- arclist.cs
- EventLogPermissionAttribute.cs
- ConvertTextFrag.cs
- SmtpException.cs
- ChtmlLinkAdapter.cs
- DecimalConstantAttribute.cs
- HostExecutionContextManager.cs
- PKCS1MaskGenerationMethod.cs
- CFStream.cs
- loginstatus.cs
- CapacityStreamGeometryContext.cs
- CurrentTimeZone.cs
- DataPager.cs
- TaiwanLunisolarCalendar.cs
- DrawingAttributes.cs
- HyperLinkColumn.cs
- WindowsStreamSecurityUpgradeProvider.cs
- CellLabel.cs
- CharacterBufferReference.cs
- ComponentDispatcherThread.cs
- Timeline.cs
- GridViewColumn.cs
- ColorConvertedBitmap.cs
- BrowserCapabilitiesFactory.cs
- TiffBitmapDecoder.cs
- AssemblyBuilderData.cs
- StreamGeometry.cs
- CustomTypeDescriptor.cs
- XmlElement.cs
- RuntimeEnvironment.cs
- OleTxTransactionInfo.cs
- _NTAuthentication.cs
- DiagnosticsConfiguration.cs
- EncryptedReference.cs
- NetMsmqSecurityElement.cs
- CodeFieldReferenceExpression.cs
- XmlTextEncoder.cs
- FontInfo.cs
- Matrix3DConverter.cs
- PictureBoxDesigner.cs
- _DomainName.cs
- TextHidden.cs
- TemplateBamlRecordReader.cs
- ResolveNameEventArgs.cs
- PersonalizationStateQuery.cs
- OdbcError.cs
- ExpandSegmentCollection.cs
- ToolStripRenderEventArgs.cs
- FrameworkElementAutomationPeer.cs
- assemblycache.cs
- HyperLink.cs
- Utils.cs
- WbemProvider.cs
- CheckedListBox.cs
- UrlPath.cs
- SQLInt64Storage.cs
- ReflectEventDescriptor.cs
- ToolStripProfessionalLowResolutionRenderer.cs
- TransformConverter.cs
- ActivityInterfaces.cs
- XmlSerializableWriter.cs
- SystemUnicastIPAddressInformation.cs
- DataBindingCollection.cs
- WindowsContainer.cs
- _NTAuthentication.cs
- XhtmlBasicLiteralTextAdapter.cs
- DynamicValidator.cs
- ClientConfigurationHost.cs
- NativeMethods.cs