[Mono-dev] Mono's reflection implementation

Kris Mok rednaxela0607 at hotmail.com
Thu Sep 10 08:59:20 EDT 2009


Hi Robert,

No, MS.NET's delegate declares _target, _methodBase, _methodPtr and 
_methodPtrAux in System.Delegate, the same way Mono's System.Delegate 
declares m_target, method_ptr and the like. But they might have had some 
special treatment to the delegates' implementations. Both MS.NET and Mono 
show the same output for the following snippet:

using System;
using System.Reflection;

class Foo {
    int _a;
}

class Bar {
    int _b;
}

static class Program {
    static void PrintNonPublicMembers(Type type) {
        Console.WriteLine("non-public instance fields of {0}", type);
        var mInfos = type.GetFields(BindingFlags.NonPublic | 
BindingFlags.Instance);
        if (0 == mInfos.Length) Console.WriteLine("mInfos is empty");
        foreach (var mi in mInfos) {
            Console.WriteLine(mi);
        }
    }

    static void Main(string[] args) {
        PrintNonPublicMembers(typeof(Foo));
        PrintNonPublicMembers(typeof(Bar));
    }
}

You're right that BindingFlags.NonPublic doesn't return inherited fields. 
Looks like I should have sent a bug report to MS instead :)

Thank you for your reply,
Kris Mok

> Date: Thu, 10 Sep 2009 14:10:09 +0200
> From: Robert Jordan <robertj at gmx.net>
> Subject: Re: [Mono-dev] Mono's reflection implementation
> To: mono-devel-list at lists.ximian.com
> Message-ID: <h8aqb2$gnp$1 at ger.gmane.org>
> Content-Type: text/plain; charset=ISO-8859-1; format=flowed
>
> Hi,
>
> This is not a bug. BindingFlags.NonPublic does not return inherited
> non-public class members.
>
> It seems that MS.NET's internal delegate implementation is different
> from Mono's. Maybe they are explicitly defining these fields in
> inherited delegates.
>
> Robert
 



More information about the Mono-devel-list mailing list