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

  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.Collections;
  20.     using System.Globalization;
  21.     using System.Reflection;
  22.     using System.Text;
  23.    
  24.     public sealed class TypedArray : IReflect
  25.     {
  26.         internal IReflect elementType;
  27.         internal int rank;
  28.        
  29.         public TypedArray(IReflect elementType, int rank)
  30.         {
  31.             this.elementType = elementType;
  32.             this.rank = rank;
  33.         }
  34.        
  35.         public override bool Equals(object obj)
  36.         {
  37.             if (obj is TypedArray)
  38.                 return this.ToString().Equals(obj.ToString());
  39.             Type t = obj as Type;
  40.             if (t == null)
  41.                 return false;
  42.             if (!t.IsArray)
  43.                 return false;
  44.             if (t.GetArrayRank() != this.rank)
  45.                 return false;
  46.             return this.elementType.Equals(t.GetElementType());
  47.         }
  48.        
  49.         public FieldInfo GetField(string name, BindingFlags bindingAttr)
  50.         {
  51.             return Typeob.Array.GetField(name, bindingAttr);
  52.         }
  53.        
  54.         public FieldInfo[] GetFields(BindingFlags bindingAttr)
  55.         {
  56.             return Typeob.Array.GetFields(bindingAttr);
  57.         }
  58.        
  59.         public override int GetHashCode()
  60.         {
  61.             return this.ToString().GetHashCode();
  62.         }
  63.        
  64.         public MemberInfo[] GetMember(string name, BindingFlags bindingAttr)
  65.         {
  66.             return Typeob.Array.GetMember(name, bindingAttr);
  67.         }
  68.        
  69.         public MemberInfo[] GetMembers(BindingFlags bindingAttr)
  70.         {
  71.             return Typeob.Array.GetMembers(bindingAttr);
  72.         }
  73.        
  74.         public MethodInfo GetMethod(string name, BindingFlags bindingAttr)
  75.         {
  76.             return Typeob.Array.GetMethod(name, bindingAttr);
  77.         }
  78.        
  79.         public MethodInfo GetMethod(string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers)
  80.         {
  81.             return Typeob.Array.GetMethod(name, bindingAttr, binder, types, modifiers);
  82.         }
  83.        
  84.         public MethodInfo[] GetMethods(BindingFlags bindingAttr)
  85.         {
  86.             return Typeob.Array.GetMethods(bindingAttr);
  87.         }
  88.        
  89.         public PropertyInfo GetProperty(string name, BindingFlags bindingAttr)
  90.         {
  91.             return Typeob.Array.GetProperty(name, bindingAttr);
  92.         }
  93.        
  94.         public PropertyInfo GetProperty(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers)
  95.         {
  96.             return Typeob.Array.GetProperty(name, bindingAttr, binder, returnType, types, modifiers);
  97.         }
  98.        
  99.         public PropertyInfo[] GetProperties(BindingFlags bindingAttr)
  100.         {
  101.             return Typeob.Array.GetProperties(bindingAttr);
  102.         }
  103.        
  104.         public object InvokeMember(string name, BindingFlags flags, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo locale, string[] namedParameters)
  105.         {
  106.             if ((flags & BindingFlags.CreateInstance) == 0)
  107.                 //Try to create an instance of the array
  108.                 return LateBinding.CallValue(this.elementType, args, true, true, null, null, binder, locale, namedParameters);
  109.             return Typeob.Array.InvokeMember(name, flags, binder, target, args, modifiers, locale, namedParameters);
  110.         }
  111.        
  112.         static internal string ToRankString(int rank)
  113.         {
  114.             switch (rank) {
  115.                 case 1:
  116.                     return "[]";
  117.                 case 2:
  118.                     return "[,]";
  119.                 case 3:
  120.                     return "[,,]";
  121.                 default:
  122.                     StringBuilder str = new StringBuilder(rank + 1);
  123.                     str.Append('[');
  124.                     for (int i = 1; i < rank; i++)
  125.                         str.Append(',');
  126.                     str.Append(']');
  127.                     return str.ToString();
  128.             }
  129.         }
  130.        
  131.         public override string ToString()
  132.         {
  133.             Type elemType = this.elementType as Type;
  134.             if (elemType != null)
  135.                 return elemType.FullName + TypedArray.ToRankString(this.rank);
  136.             ClassScope csc = this.elementType as ClassScope;
  137.             if (csc != null)
  138.                 return csc.GetFullName() + TypedArray.ToRankString(this.rank);
  139.             TypedArray tarr = this.elementType as TypedArray;
  140.             if (tarr != null)
  141.                 return tarr.ToString() + TypedArray.ToRankString(this.rank);
  142.             return Convert.ToType(this.elementType).FullName + TypedArray.ToRankString(this.rank);
  143.         }
  144.        
  145.         internal Type ToType()
  146.         {
  147.             Type elemType = Convert.ToType(this.elementType);
  148.             return Convert.ToType(TypedArray.ToRankString(this.rank), elemType);
  149.         }
  150.        
  151.         public Type UnderlyingSystemType {
  152.             get { return this.GetType(); }
  153.         }
  154.     }
  155. }

Developer Fusion