internal MemberInfo BindToMember(){
Debug.Assert(this.obj != null && this.name != null);
if (this.obj == this.last_object && this.last_member != null)
return this.last_member;
BindingFlags flags = BindingFlags.Instance|BindingFlags.Public;
Object obj = this.obj;
Type t = obj.GetType();
TypeReflector tr = TypeReflector.GetTypeReflectorFor(t);
IReflect ir = null;
if (tr.ImplementsIReflect()){
ir = obj as ScriptObject;
if (ir != null){
if (obj is ClassScope)
flags = BindingFlags.Static|BindingFlags.Public;
}else{
ir = obj as Type;
if (ir != null)
flags = BindingFlags.Static|BindingFlags.Public;
else
ir = (IReflect)obj;
}
}else
ir = tr;
this.last_object = this.obj;
this.last_ir = ir;
MemberInfo[] members = this.last_members = ir.GetMember(this.name, flags);
this.last_member = LateBinding.SelectMember(members);
if (this.obj is Type){ //Add instance members of type Type to the member list
MemberInfo[] tmembers = typeof(Type).GetMember(this.name, BindingFlags.Instance|BindingFlags.Public);
int n = 0, m = 0;
if (tmembers != null && (n = tmembers.Length) > 0){
if (members == null || (m = members.Length) == 0)
this.last_member = LateBinding.SelectMember(this.last_members = tmembers);
else{
MemberInfo[] jmembers = new MemberInfo[n + m];
ArrayObject.Copy(members, 0, jmembers, 0, m);
ArrayObject.Copy(tmembers, 0, jmembers, m, n);
this.last_member = LateBinding.SelectMember(this.last_members = jmembers);
}
}
}
return this.last_member;
}