[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Dotgnu-pnet-commits] CVS: pnetlib/runtime/System/Reflection ClrType.cs,
From: |
Gopal.V <address@hidden> |
Subject: |
[Dotgnu-pnet-commits] CVS: pnetlib/runtime/System/Reflection ClrType.cs, 1.16, 1.17 |
Date: |
Fri, 25 Jul 2003 10:17:55 -0400 |
Update of /cvsroot/dotgnu-pnet/pnetlib/runtime/System/Reflection
In directory subversions:/tmp/cvs-serv19956/runtime/System/Reflection
Modified Files:
ClrType.cs
Log Message:
Fix bug #2688 by trimming member lists
Index: ClrType.cs
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnetlib/runtime/System/Reflection/ClrType.cs,v
retrieving revision 1.16
retrieving revision 1.17
diff -C2 -r1.16 -r1.17
*** ClrType.cs 16 Apr 2003 03:17:55 -0000 1.16
--- ClrType.cs 25 Jul 2003 14:17:53 -0000 1.17
***************
*** 23,26 ****
--- 23,27 ----
using System;
+ using System.Collections;
using System.Globalization;
using System.Runtime.CompilerServices;
***************
*** 233,237 ****
Type arrayType,
String name);
!
// Implementation of "GetConstructor" provided by subclasses.
protected override ConstructorInfo
--- 234,396 ----
Type arrayType,
String name);
!
!
! [Flags]
! private enum MemberComparison
! {
! None = 0x01,
! Candidate = 0x02,
! Override = 0x04,
! }
!
! /*
! * Check if m1 overrides m2
! */
! private MemberComparison CompareMembers(MemberInfo m1, MemberInfo m2)
! {
! if(m1.MemberType != m2.MemberType ||
m1.Name!=m2.Name)
! {
! return MemberComparison.None;
! }
! if(m1.MemberType==MemberTypes.Field)
! {
!
if(((FieldInfo)m1).Attributes==((FieldInfo)m2).Attributes)
! {
! goto overrideCheck;
! }
! }
! MethodBase method1, method2;
! switch(m1.MemberType)
! {
! case MemberTypes.Constructor:
! {
! method1=(MethodBase)m1;
! method2=(MethodBase)m2;
! }
! break;
!
! case MemberTypes.Method:
! {
! method1=(MethodBase)m1;
! method2=(MethodBase)m2;
! }
! break;
!
! case MemberTypes.Property:
! {
!
if(((PropertyInfo)m1).GetAccessors().Length==0 &&
!
((PropertyInfo)m2).GetAccessors().Length==0)
! {
!
if(((PropertyInfo)m1).Attributes ==
!
((PropertyInfo)m2).Attributes)
! {
! goto
overrideCheck;
! }
! }
!
!
method1=((PropertyInfo)m1).GetGetMethod() != null ?
!
((PropertyInfo)m1).GetGetMethod() :
!
((PropertyInfo)m1).GetSetMethod() ;
!
!
method2=((PropertyInfo)m2).GetGetMethod() != null ?
!
((PropertyInfo)m2).GetGetMethod() :
!
((PropertyInfo)m2).GetSetMethod() ;
! }
! break;
!
! case MemberTypes.Event:
! {
!
method1=((EventInfo)m1).GetAddMethod() != null ?
!
((EventInfo)m1).GetAddMethod() :
!
((EventInfo)m1).GetRemoveMethod() ;
!
!
method2=((EventInfo)m2).GetAddMethod() != null ?
!
((EventInfo)m2).GetAddMethod() :
!
((EventInfo)m2).GetRemoveMethod() ;
! }
! break;
! }
! if((method1.Attributes |
MethodAttributes.NewSlot)
! != (method1.Attributes
| MethodAttributes.NewSlot))
! {
! return MemberComparison.None;
! }
!
! ParameterInfo [] pinfo1 =
method1.GetParameters();
! ParameterInfo [] pinfo2 =
method2.GetParameters();
! if(pinfo1.Length != pinfo2.Length)
! {
! return MemberComparison.None;
! }
! for(int i=0;i<pinfo1.Length;i++)
! {
!
if(pinfo1[i].Attributes!=pinfo2[i].Attributes ||
! pinfo1[i].ParameterType !=
pinfo2[i].ParameterType)
! {
! return MemberComparison.None;
! }
! }
!
! if(method1 is MethodInfo)
! {
!
if(((MethodInfo)method2).ReturnType.Equals(
!
((MethodInfo)method1).ReturnType))
! {
! return MemberComparison.None;
! }
! }
! overrideCheck:
!
if(m1.DeclaringType.IsSubclassOf(m2.DeclaringType))
! {
! return MemberComparison.Candidate
! |
MemberComparison.Override;
! }
! return MemberComparison.Candidate;
! }
!
! /// <summary>
! /// This function sorts and removes overrides from an array of
! /// MemberInfo[]
! /// </summary>
! private Object TrimMembers(Object memberArray, Type type)
! {
! MemberInfo[]
members=(MemberInfo[])(memberArray);
! ArrayList list=new ArrayList(members.Length/2);
! int best;
!
! for(int i=0;i<members.Length-1;i++)
! {
! best=i;
! if(members[best]==null)
! {
! continue;
! }
! for(int j=i+1;j<members.Length;j++)
! {
! if(members[j]==null)
! {
! continue;
! }
!
! MemberComparison
cmp=CompareMembers(members[j],
!
members[best]);
! if((cmp &
MemberComparison.Candidate)!= 0)
! {
! if((cmp &
MemberComparison.Override)!= 0)
! {
!
members[best]=null;
! best=j;
! }
! else
! {
! members[j]=null;
! }
! }
! }
! list.Add(members[best]);
! }
! return list.ToArray(type);
! }
!
// Implementation of "GetConstructor" provided by subclasses.
protected override ConstructorInfo
***************
*** 262,269 ****
BindingFlags.Instance;
}
! return (ConstructorInfo[])GetMembersImpl
(MemberTypes.Constructor,
bindingAttr |
BindingFlags.DeclaredOnly,
!
typeof(ConstructorInfo[]), null);
}
--- 421,429 ----
BindingFlags.Instance;
}
! return
(ConstructorInfo[])TrimMembers(GetMembersImpl
(MemberTypes.Constructor,
bindingAttr |
BindingFlags.DeclaredOnly,
!
typeof(ConstructorInfo[]), null),
!
typeof(ConstructorInfo));
}
***************
*** 280,286 ****
public override EventInfo[] GetEvents(BindingFlags bindingAttr)
{
! return (EventInfo[])GetMembersImpl
(MemberTypes.Event,
bindingAttr,
! typeof(EventInfo[]),
null);
}
--- 440,447 ----
public override EventInfo[] GetEvents(BindingFlags bindingAttr)
{
! return (EventInfo[])TrimMembers(GetMembersImpl
(MemberTypes.Event,
bindingAttr,
! typeof(EventInfo[]),
null),
! typeof(EventInfo));
}
***************
*** 297,303 ****
public override FieldInfo[] GetFields(BindingFlags bindingAttr)
{
! return (FieldInfo[])GetMembersImpl
! (MemberTypes.Field,
bindingAttr,
! typeof(FieldInfo[]),
null);
}
--- 458,465 ----
public override FieldInfo[] GetFields(BindingFlags bindingAttr)
{
! return (FieldInfo[]) TrimMembers(GetMembersImpl
!
(MemberTypes.Field, bindingAttr,
!
typeof(FieldInfo[]), null),
!
typeof(FieldInfo));
}
***************
*** 315,320 ****
throw new ArgumentNullException("name");
}
! return (MemberInfo[])GetMembersImpl
! (type, bindingAttr,
typeof(MemberInfo[]), name);
}
--- 477,484 ----
throw new ArgumentNullException("name");
}
! return (MemberInfo[]) TrimMembers(GetMembersImpl
!
(type, bindingAttr,
!
typeof(MemberInfo[]), name),
!
typeof(MemberInfo));
}
***************
*** 322,328 ****
public override MemberInfo[] GetMembers(BindingFlags bindingAttr)
{
! return (MemberInfo[])GetMembersImpl
! (MemberTypes.All,
bindingAttr,
! typeof(MemberInfo[]),
null);
}
--- 486,494 ----
public override MemberInfo[] GetMembers(BindingFlags bindingAttr)
{
! return (MemberInfo[]) TrimMembers(GetMembersImpl
!
(MemberTypes.All,
!
bindingAttr,
!
typeof(MemberInfo[]), null),
!
typeof(MemberInfo));
}
***************
*** 344,350 ****
public override MethodInfo[] GetMethods(BindingFlags bindingAttr)
{
! return (MethodInfo[])GetMembersImpl
! (MemberTypes.Method,
bindingAttr,
! typeof(MethodInfo[]),
null);
}
--- 510,517 ----
public override MethodInfo[] GetMethods(BindingFlags bindingAttr)
{
! return (MethodInfo[]) TrimMembers(GetMembersImpl
!
(MemberTypes.Method, bindingAttr,
!
typeof(MethodInfo[]), null),
!
typeof(MethodInfo));
}
***************
*** 382,388 ****
public override PropertyInfo[] GetProperties(BindingFlags bindingAttr)
{
! return (PropertyInfo[])GetMembersImpl
(MemberTypes.Property,
bindingAttr,
!
typeof(PropertyInfo[]), null);
}
--- 549,555 ----
public override PropertyInfo[] GetProperties(BindingFlags bindingAttr)
{
! return
(PropertyInfo[])TrimMembers(GetMembersImpl
(MemberTypes.Property,
bindingAttr,
!
typeof(PropertyInfo[]), null),typeof(PropertyInfo));
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Dotgnu-pnet-commits] CVS: pnetlib/runtime/System/Reflection ClrType.cs, 1.16, 1.17,
Gopal.V <address@hidden> <=