clrproperty.cs
来自「没的 没的 没的 没的 没的 没的 没的 没的 没的 没的 没的 没的 没的 没」· CS 代码 · 共 320 行
CS
320 行
/* * ClrProperty.cs - Implementation of the * "System.Reflection.ClrProperty" class. * * Copyright (C) 2001 Southern Storm Software, Pty Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */namespace System.Reflection{#if CONFIG_REFLECTIONusing System;using System.Text;using System.Globalization;using System.Runtime.CompilerServices;using System.Runtime.Serialization;internal sealed class ClrProperty : PropertyInfo, IClrProgramItem#if CONFIG_SERIALIZATION , ISerializable#endif{ // Private data used by the runtime engine. private IntPtr privateData; // Implement the IClrProgramItem interface. public IntPtr ClrHandle { get { return privateData; } } // Get the custom attributes attached to this property. public override Object[] GetCustomAttributes(bool inherit) { return ClrHelpers.GetCustomAttributes(this, inherit); } public override Object[] GetCustomAttributes(Type type, bool inherit) { return ClrHelpers.GetCustomAttributes(this, type, inherit); } // Determine if custom attributes are defined for this property. public override bool IsDefined(Type type, bool inherit) { return ClrHelpers.IsDefined(this, type, inherit); } // Override inherited properties. public override Type DeclaringType { get { return ClrHelpers.GetDeclaringType(this); } } public override Type ReflectedType { get { return ClrHelpers.GetDeclaringType(this); } } public override String Name { get { return ClrHelpers.GetName(this); } } public override PropertyAttributes Attributes { get { return (PropertyAttributes) ClrHelpers.GetMemberAttrs(privateData); } } public override bool CanRead { get { return ClrHelpers.HasSemantics (privateData, MethodSemanticsAttributes.Getter, true); } } public override bool CanWrite { get { return ClrHelpers.HasSemantics (privateData, MethodSemanticsAttributes.Setter, true); } } public override Type PropertyType { get { return GetPropertyType(privateData); } } // Get an array of all accessor methods on this property. public override MethodInfo[] GetAccessors(bool nonPublic) { MethodInfo getter = ClrHelpers.GetSemantics(privateData, MethodSemanticsAttributes.Getter, nonPublic); MethodInfo setter = ClrHelpers.GetSemantics(privateData, MethodSemanticsAttributes.Setter, nonPublic); MethodInfo other = ClrHelpers.GetSemantics(privateData, MethodSemanticsAttributes.Other, nonPublic); int size = ((getter != null) ? 1 : 0) + ((setter != null) ? 1 : 0) + ((other != null) ? 1 : 0); MethodInfo[] array = new MethodInfo [size]; int posn = 0; if(getter != null) { array[posn++] = getter; } if(setter != null) { array[posn++] = setter; } if(other != null) { array[posn++] = other; } return array; } // Get the "get" accessor method on this property. public override MethodInfo GetGetMethod(bool nonPublic) { return ClrHelpers.GetSemantics (privateData, MethodSemanticsAttributes.Getter, nonPublic); } // Get the index parameters for this property. public override ParameterInfo[] GetIndexParameters() { MethodInfo method = ClrHelpers.GetSemantics(privateData, MethodSemanticsAttributes.Getter, true); if(method != null) { return method.GetParameters(); } method = ClrHelpers.GetSemantics(privateData, MethodSemanticsAttributes.Setter, true); if(method != null) { ParameterInfo[] parameters = method.GetParameters(); ParameterInfo[] newParams; if(parameters != null && parameters.Length >= 1) { newParams = new ParameterInfo [parameters.Length - 1]; Array.Copy(parameters, newParams, newParams.Length); return newParams; } } throw new MethodAccessException (_("Reflection_NoPropertyAccess")); } // Get the "set" accessor method on this property. public override MethodInfo GetSetMethod(bool nonPublic) { return ClrHelpers.GetSemantics (privateData, MethodSemanticsAttributes.Setter, nonPublic); } // Get the value associated with this property on an object. public override Object GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture) { MethodInfo getter = ClrHelpers.GetSemantics(privateData, MethodSemanticsAttributes.Getter, true); if(getter == null) { throw new ArgumentException (_("Reflection_NoPropertyGet")); } return getter.Invoke(obj, invokeAttr, binder, index, culture); } public override Object GetValue(Object obj, Object[] index) { MethodInfo getter = ClrHelpers.GetSemantics(privateData, MethodSemanticsAttributes.Getter, true); if(getter == null) { throw new ArgumentException (_("Reflection_NoPropertyGet")); } return getter.Invoke(obj, BindingFlags.Default, Type.DefaultBinder, index, null); } // Set the value associated with this property on an object. public override void SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture) { MethodInfo setter = ClrHelpers.GetSemantics(privateData, MethodSemanticsAttributes.Setter, true); if(setter == null) { throw new ArgumentException (_("Reflection_NoPropertySet")); } Object[] parameters; if(index == null) { parameters = new Object [1]; parameters[0] = value; } else { parameters = new Object [index.Length + 1]; Array.Copy(index, parameters, index.Length); parameters[index.Length] = value; } setter.Invoke(obj, invokeAttr, binder, parameters, culture); } public override void SetValue(Object obj, Object value, Object[] index) { MethodInfo setter = ClrHelpers.GetSemantics(privateData, MethodSemanticsAttributes.Setter, true); if(setter == null) { throw new ArgumentException (_("Reflection_NoPropertySet")); } Object[] parameters; if(index == null) { parameters = new Object [1]; parameters[0] = value; } else { parameters = new Object [index.Length + 1]; Array.Copy(index, parameters, index.Length); parameters[index.Length] = value; } setter.Invoke(obj, BindingFlags.Default, Type.DefaultBinder, parameters, null); } // Get the type associated with this property item. [MethodImpl(MethodImplOptions.InternalCall)] extern private static Type GetPropertyType(IntPtr item); // Convert the property name into a string. public override String ToString() { StringBuilder builder = new StringBuilder(); builder.Append(PropertyType.ToString()); builder.Append(' '); builder.Append(Name); return builder.ToString(); }#if CONFIG_SERIALIZATION // Get the serialization data for this property. public void GetObjectData(SerializationInfo info, StreamingContext context) { if(info == null) { throw new ArgumentNullException("info"); } MemberInfoSerializationHolder.Serialize (info, MemberTypes.Property, Name, null, ReflectedType); }#endif}; // class RuntimePropertyInfo#endif // CONFIG_REFLECTION}; // namespace System.Reflection
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?