274 |
} |
} |
275 |
if(m1.MemberType==MemberTypes.Field) |
if(m1.MemberType==MemberTypes.Field) |
276 |
{ |
{ |
277 |
if(((FieldInfo)m1).Attributes==((FieldInfo)m2).Attributes) |
FieldInfo f1 = (FieldInfo)m1; |
278 |
|
FieldInfo f2 = (FieldInfo)m2; |
279 |
|
|
280 |
|
if(f1.Attributes == f2.Attributes) |
281 |
{ |
{ |
282 |
|
if(((f1.Attributes & FieldAttributes.FieldAccessMask) & FieldAttributes.Private) != 0) |
283 |
|
{ |
284 |
|
// Private members never override each other. |
285 |
|
// Very important for serialization. |
286 |
|
// TODO: more research on protected and internal stuff here. |
287 |
|
return MemberComparison.None; |
288 |
|
} |
289 |
goto overrideCheck; |
goto overrideCheck; |
290 |
} |
} |
291 |
} |
} |
380 |
} |
} |
381 |
|
|
382 |
/// <summary> |
/// <summary> |
383 |
/// This function sorts and removes overrides from an array of |
/// This function removes overrides from an array of |
384 |
/// MemberInfo[] |
/// MemberInfo[] while retaining original order of |
385 |
|
/// the members in the array. |
386 |
/// </summary> |
/// </summary> |
387 |
private Object TrimMembers(Object memberArray, Type type) |
private Object TrimMembers(Object memberArray, Type type) |
388 |
{ |
{ |
389 |
MemberInfo[] members=(MemberInfo[])(memberArray); |
MemberInfo[] members=(MemberInfo[])(memberArray); |
390 |
ArrayList list=new ArrayList(members.Length/2); |
BitArray visibleMask = new BitArray(members.Length, false); |
391 |
|
int count = 0; |
392 |
int best; |
int best; |
393 |
|
|
394 |
// Sort the members on name to make it easier to |
// Technically speaking, this algorithm |
395 |
// efficiently remove overrides. |
// should not touch a type twice in the |
396 |
Array.Sort(members, memberNameComparer); |
// inner loop. Need to fix that up |
397 |
|
// Real Soon Now (tm). |
398 |
// Remove overrides from the list. |
for(int i = 0; i < members.Length; i++) |
|
int i = 0; |
|
|
while(i < members.Length) |
|
399 |
{ |
{ |
400 |
best = i; |
best = i; |
401 |
++i; |
for(int j = 0; j < members.Length; j++) |
|
while(i < members.Length && |
|
|
members[i].Name == members[best].Name) |
|
402 |
{ |
{ |
403 |
MemberComparison cmp = CompareMembers(members[i], |
if(members[j].Name != members[best].Name) |
404 |
members[best]); |
{ |
405 |
|
continue; |
406 |
|
} |
407 |
|
MemberComparison cmp = CompareMembers(members[j], |
408 |
|
members[best]); |
409 |
if(cmp == MemberComparison.None) |
if(cmp == MemberComparison.None) |
410 |
{ |
{ |
411 |
break; |
break; |
414 |
{ |
{ |
415 |
if((cmp & MemberComparison.Override) != 0) |
if((cmp & MemberComparison.Override) != 0) |
416 |
{ |
{ |
417 |
best = i; |
best = j; |
418 |
} |
} |
419 |
} |
} |
|
++i; |
|
420 |
} |
} |
421 |
list.Add(members[best]); |
if(visibleMask[best] == false) |
422 |
|
{ |
423 |
|
visibleMask[best] = true; |
424 |
|
count++; |
425 |
|
} |
426 |
|
} |
427 |
|
MemberInfo [] newMembers = (MemberInfo[])Array.CreateInstance(type,count); |
428 |
|
for(int i = 0, j = 0; i < visibleMask.Count; i++) |
429 |
|
{ |
430 |
|
if(visibleMask[i] == true) |
431 |
|
{ |
432 |
|
newMembers[j++] = members[i]; |
433 |
|
} |
434 |
} |
} |
435 |
return list.ToArray(type); |
return newMembers; |
436 |
} |
} |
437 |
|
|
438 |
// Implementation of "GetConstructor" provided by subclasses. |
// Implementation of "GetConstructor" provided by subclasses. |