Bug 40729 - Support binding constructors as static methods
Summary: Support binding constructors as static methods
Status: CONFIRMED
Alias: None
Product: iOS
Classification: Xamarin
Component: Tools (show other bugs)
Version: master
Hardware: PC Mac OS
: --- enhancement
Target Milestone: Future Cycle (TBD)
Assignee: Bugzilla
URL:
Depends on:
Blocks:
 
Reported: 2016-04-27 12:13 UTC by Rolf Bjarne Kvinge [MSFT]
Modified: 2017-02-28 10:21 UTC (History)
1 user (show)

See Also:
Tags:
Is this bug a regression?: ---
Last known good build:


Attachments

Description Rolf Bjarne Kvinge [MSFT] 2016-04-27 12:13:43 UTC
Currently when binding constructors it's possible to run into a situation where multiple Objective-C constructors have the same signature in C#, and can thus only one of them can be bound as C# constructor.

The idea would be to add support for adding an attribute to say that a constructor should be bound as a static method instead:

    [Export ("initWithSomething:")]
    [BindAsStatic ("CreateWithSomething")]
    IntPtr Constructor (int something);

that would generate this method:

    public static TheType CraeteWithSomething (int something) {}

instead of the constructor:

    public TheType (int something) {}

Additionally it would be nice to be able to specify that the static method should return an autoreleased IntPtr instead of TheType, since then you can expose it using a manual constructor instead:

    [Export ("initWithSomething:")]
    [BindAsStatic ("CreateWithSomething", ReturnAutoreleasedIntPtr = true)]
    IntPtr Constructor (int something);

which would generate this:


    private static IntPtr CraeteWithSomething (int something) {}

which could be used in a manual binding like this:

    static IntPtr Create (int something, Enum otherArgument)
    {
        if (otherArgument == EnumType.A) {
            return CraeteWithSomething (something);
        } else {
            return CreateWithSomethingElse (something);
        }
    }

    public TheType (int something, Enum otherArgument)
        : base (Create (something, otherArgument))
    {}

Note You need to log in before you can comment on or make changes to this bug.