C# member method as static method ("reversed extension method")

Is it possible in C# to get a reference to a member function without specifying the object, so that it is usable like a static extension method, taking the object as first parameter?

class Handler
{
    public void Add(int value) { ... }
}

static class HandlerExtensions
{
    public static void AddEx(this Handler instance, int value) { ... }
}


var x = new Handler();

// possible:
Action<int> func1 = x.Add;
Action<Handler, int> func2 = HandlerExtensions.AddEx;

// not possible?
Action<Handler, int> func3 = Handler::Add;

Why would I want to do that? To specify methods to call in a class before having an actual object to work with:

// current solution:
void RegisterDto<DataType>(Func<Handler, Action<DataType>> handler) { ... }
RegisterDto<int>(x => x.Add);

// desired solution:
void RegisterDto<DataType>(Action<Handler, DataType> handler) { ... }
RegisterDto<int>(Handler::Add); // <--- does syntax for this exist?
Jon Skeet
people
quotationmark

If you mean "can you create a delegate like that" then the answer is "yes, but it's slightly ugly". I don't think you can use a method group conversion, but you can use reflection and Delegate.CreateDelegate, e.g.

MethodInfo method = typeof(Handler).GetMethod("Add");
var action = (Action<Handler, int>) 
    Delegate.CreateDelegate(typeof(Action<Handler, int>), method);

It would be nice to have a method group conversion here, I agree.

people

See more on this question at Stackoverflow