The Labs \ Source Viewer \ SSCLI \ Microsoft.JScript \ JSPropertyInfo

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. namespace Microsoft.JScript
  16. {
  17.    
  18.     using System;
  19.     using System.Reflection;
  20.     using System.Globalization;
  21.    
  22.     internal class JSPropertyInfo : PropertyInfo
  23.     {
  24.         private PropertyInfo property;
  25.         private Type declaringType = null;
  26.         internal MethodInfo getter = null;
  27.         internal MethodInfo setter = null;
  28.        
  29.         internal JSPropertyInfo(PropertyInfo property)
  30.         {
  31.             this.property = property;
  32.         }
  33.        
  34.         public override PropertyAttributes Attributes {
  35.             get { return this.property.Attributes; }
  36.         }
  37.        
  38.         public override bool CanRead {
  39.             get { return this.property.CanRead; }
  40.         }
  41.        
  42.         public override bool CanWrite {
  43.             get { return this.property.CanWrite; }
  44.         }
  45.        
  46.         public override Type DeclaringType {
  47.             get {
  48.                 Type result = this.declaringType;
  49.                 if (result == null)
  50.                     this.declaringType = result = this.property.DeclaringType;
  51.                 return result;
  52.             }
  53.         }
  54.        
  55.         public override MethodInfo GetGetMethod(bool nonPublic)
  56.         {
  57.             MethodInfo getter = this.getter;
  58.             if (getter == null) {
  59.                 getter = this.property.GetGetMethod(nonPublic);
  60.                 if (getter != null)
  61.                     getter = new JSMethodInfo(getter);
  62.                 this.getter = getter;
  63.             }
  64.             return getter;
  65.         }
  66.        
  67.         public override ParameterInfo[] GetIndexParameters()
  68.         {
  69.             MethodInfo getter = this.GetGetMethod(false);
  70.             if (getter != null)
  71.                 return getter.GetParameters();
  72.             return this.property.GetIndexParameters();
  73.         }
  74.        
  75.         public override MethodInfo GetSetMethod(bool nonPublic)
  76.         {
  77.             MethodInfo setter = this.setter;
  78.             if (setter == null) {
  79.                 setter = this.property.GetSetMethod(nonPublic);
  80.                 if (setter != null)
  81.                     setter = new JSMethodInfo(setter);
  82.                 this.setter = setter;
  83.             }
  84.             return setter;
  85.         }
  86.        
  87.         public override MethodInfo[] GetAccessors(bool nonPublic)
  88.         {
  89.             throw new JScriptException(JSError.InternalError);
  90.         }
  91.        
  92.         public override object[] GetCustomAttributes(Type t, bool inherit)
  93.         {
  94.             return CustomAttribute.GetCustomAttributes(this.property, t, inherit);
  95.         }
  96.        
  97.         public override object[] GetCustomAttributes(bool inherit)
  98.         {
  99.             return this.property.GetCustomAttributes(inherit);
  100.         }
  101.        
  102.         public override object GetValue(object obj, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture)
  103.         {
  104.             return this.GetGetMethod(false).Invoke(obj, invokeAttr, binder, index == null ? new object[0] : index, culture);
  105.         }
  106.        
  107.         public override bool IsDefined(Type type, bool inherit)
  108.         {
  109.             return CustomAttribute.IsDefined(this.property, type, inherit);
  110.         }
  111.        
  112.         public override string Name {
  113.             get { return this.property.Name; }
  114.         }
  115.        
  116.         public override Type PropertyType {
  117.             get { return this.property.PropertyType; }
  118.         }
  119.        
  120.         public override Type ReflectedType {
  121.             get { return this.property.ReflectedType; }
  122.         }
  123.        
  124.         public override void SetValue(object obj, object value, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture)
  125.         {
  126.             if (index == null || index.Length == 0)
  127.                 this.GetSetMethod(false).Invoke(obj, invokeAttr, binder, new object[] {value}, culture);
  128.             else {
  129.                 int n = index.Length;
  130.                 object[] args = new object[n + 1];
  131.                 ArrayObject.Copy(index, 0, args, 0, n);
  132.                 args[n] = value;
  133.                 this.GetSetMethod(false).Invoke(obj, invokeAttr, binder, args, culture);
  134.             }
  135.         }
  136.        
  137.     }
  138. }

Developer Fusion