[IronPython] PrivateBindings fails to expose functions in internal classes, but not properties

Leo Carbajal desleo at gmail.com
Sun Jan 9 01:07:06 CET 2011


Ok, here's a clarification.

Say you have this class:

internal class ZMPReporter : IReporter
    {
        public string Setting { get; set; }

        internal void Trixery(string mes, string mes1, string mes2, bool
thing)
        {
            Flash(mes, mes1, mes2, thing);
        }

        public void Flash(string sender, string message, string recipient,
bool isAuthor)
        {
            ...
        }
    }

It's a property of another class. In C# I would use it as follows:
caller.Reporter.Flash(..parameters..)

If I call it in a normal IPy engine it fails to even recognize the caller
variable, which is fine and totally expected (and desired). In the
PrivateBinding scenario described I can call

caller.Reporter.Setting and get the text data perfectly. When I try to call
caller.Reporter.Flash(), though, I get the System Error: object reference
not set problem. However, I can call caller.Report._ZMPReporter__Trixery()
just fine, which in turn calls Flash for me.

I don't mind using the name mangling overly, but I do mind having to make
internal proxies for perfectly good, already existing, functions. I can't
just make those methods internal because the IReporter interface demands
that they be public. If this was the only class that might give me problems
I might even look for a way around that, but the entire project uses
Interfaces extensively.

On Sat, Jan 8, 2011 at 5:36 PM, Leo Carbajal <desleo at gmail.com> wrote:

> Hello all,
>
> Almost I thought I could have my cake and eat it too. I have a large
> client-server project written in C# that I wanted to be able to script with
> IronPython. The biggest requirement was that I wanted external admins to be
> able to provide scripts for the server to augment its functions. However, I
> don't want them to have full access to the server API so I resigned myself
> to write the project with everything Internal and then build public facing
> classes for the functionality I wanted to expose. This, I know, to work
> fine.
>
> however, I still want to be able to use scripts on the server myself, for
> other things. I ended up using two engines, one with PrivateBinding on and
> one without. The one with PrivateBinding set to true can see all private and
> internal members but whenever I try to call a function from IronPython I get
> an exception of "System Error: Object reference not set to an instance of an
> object." It's weird because I can call on properties and get their values,
> but not functions. If I do a dir() on the class, and the member, IronPython
> can clearly see what they are and that they exist. If it helps, the class
> i'm trying to access is internal but has all public members (for
> interfaces).
>
> I guess my question is whether this behavior is intentional or not. Being
> able to use my API on one engine for actual server work while providing a
> different one for plugin\event hook writers, would help tremendously.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ironpython-users/attachments/20110108/f36a98c5/attachment.html>


More information about the Ironpython-users mailing list