internal override Result Eval(Evaluator evaluater, Result[] argArray) { int num2; object obj3; int num3; if (argArray.Length < 2) { throw new ArgumentException(); } object obj2 = argArray[0].Value; if (obj2 == null) { throw new ArgumentException(); } int num = argArray.Length - 1; Type type = null; BindingFlags bindingAttr = BindingFlags.Default; if (obj2 is Type) { type = (Type)obj2; obj2 = null; bindingAttr = BindingFlags.Static; } else { type = obj2.GetType(); bindingAttr = BindingFlags.Instance; } bindingAttr = BindingFlags.Public; Type[] types = new Type[num]; object[] index = new object[num]; for (num2 = 0; num2 < num; num2++) { types[num2] = argArray[num2 + 1].Type; index[num2] = argArray[num2 + 1].Value; } Binder defaultBinder = Type.DefaultBinder; PropertyInfo info = type.GetProperty("Item", bindingAttr, defaultBinder, null, types, null); if (info == null) { info = type.GetProperty("Items", bindingAttr, defaultBinder, null, types, null); } if (info != null) { return(new Result(info.PropertyType, info.GetValue(obj2, index))); } if (obj2 == null) { throw new ArgumentException(); } if (obj2 is string) { string str = (string)obj2; num3 = (int)ConvertHelper.ChangeType(argArray[1].Value, typeof(int)); obj3 = str[num3]; return(new Result(typeof(char), obj3)); } if (obj2 is Array) { Array array = (Array)obj2; if (array.Rank != (argArray.Length - 1)) { throw new ArgumentException(); } int[] indices = new int[num]; for (num2 = 0; num2 < num; num2++) { indices[num2] = (int)ConvertHelper.ChangeType(argArray[num2 + 1].Value, typeof(int)); } obj3 = array.GetValue(indices); if (obj3 != null) { return(new Result(obj3.GetType(), obj3)); } return(new Result(null, null)); } if (!(obj2 is IList)) { throw new ArgumentException(); } IList list = (IList)obj2; if (argArray.Length != 2) { throw new ArgumentException(); } num3 = (int)ConvertHelper.ChangeType(argArray[1].Value, typeof(int)); obj3 = list[num3]; if (obj3 != null) { return(new Result(obj3.GetType(), obj3)); } return(new Result(null, null)); }