Ghooti Farangi
Ghooti Farangi

Reputation: 20166

creating an alias for a function name in C#

I want to create an alias for a funcion name in C#.

Is there any way but function overloading?

public class Test
{
    public void A()
    {
        ...
    }
}

I want to call B replace A same below.

var test = new Test();
test.B();

Upvotes: 18

Views: 23534

Answers (9)

Artur INTECH
Artur INTECH

Reputation: 7316

Even though C# does not support method alias directly, Expression-bodied members provide a nice-looking solution:

interface Schema
{
    void Generate();
    void Regenerate();
}

class PgSchema : Schema
{
    public void Generate()
    {
        Console.WriteLine("Executing original method...");
    }
    public void Regenerate() => Generate();
}

var pgSchema = new PgSchema();
pgSchema.Generate();
pgSchema.Regenerate();
// Prints "Executing original method..." two times.

Upvotes: 2

user14064955
user14064955

Reputation:

I know this is old but I do think its a relevant question and could have be addressed quite easily using delegates/Lambda expressions which were available in C# 3.0, which if memory serves me correct was around at the time of the OP.

Lets imagine we are creating a game that requires us to be signed into xbox live and have two buttons - one for signing in and one for switching user. A single function called SignIn will handle them both but this leads to poor readability when adding the onclick handler.

Fortunately this could be easily fixed using delegates and Lambda expressions.

Heres the SignIn function:

public static async void SignIn(object coreDispatcher)
{
...
}

Here is the Lambda Expression that creates the "alias"

public static async void SwitchUser(object param) => SignIn(param);

Now I can call either SignIn or SwitchUser and use the same code but provide more meaningful code

Upvotes: 1

Trey Tomes
Trey Tomes

Reputation: 76

There have been several comments on this post as to why someone would ever want to do this. I am currently implementing a Vector type for a graphics project, and the requirements document I am using refers to the Magnitude/Length of a Vector interchangeably. For the sake of efficiency, I'd rather not wrap a Magnitude() method inside of a Length() method, but it seemed like it would be nice for the sake of readability if the structure understood both terms.

The delegate method referred to by Christian Davén is probably the most efficient way to do this that I can see, but it is probably best to simply add documentation to the block of your method:

/// <summary>
/// Calculate the magnitude / length of a vector, including the W component.
/// </summary>
/// <remarks>
/// This calculation will break down if you try to take the magnitude of a point.
/// </remarks>
/// <returns>The magnitude / length of the vector.</returns>
public float Magnitude()
{
    return (float)Math.Sqrt(X * X + Y * Y + Z * Z + W * W);
}

Upvotes: 0

Christian Dav&#233;n
Christian Dav&#233;n

Reputation: 18127

I'm surprised that noone has mentioned Delegates. It's probably as close to a method alias as you will come in C#:

class DelegaTest
{
    public string F()
    {
        return null;
    }

    public string F(int arg)
    {
        return arg.ToString();
    }

    public void G(int arg1, int arg2)
    {
    }

    /// <summary>
    /// Delegate for `string F()`
    /// </summary>
    public Func<string> D1 => F;

    /// <summary>
    /// Delegate for `string F(int arg)`
    /// </summary>
    public Func<int, string> D2 => F;

    /// <summary>
    /// Delegate for `void G(int arg1, int arg2)`
    /// </summary>
    public Action<int, int> E => G;
}

Upvotes: 32

donvnielsen
donvnielsen

Reputation: 195

This is so old, but I have a response as to why a person may want to alias a method name. It happens all the time. Because some developer has given a method a name that does not make any sense or it simply does not accurately describe the purpose of the method. The method is called many times throughout an old, well-seasoned solution. So rather performing a large refactoring and retesting that cannot be justified because of a poorly named method, simply give it an alias that makes sense. That way new code will read properly in the future.

i.e. A grid control is saved, and there is a method name IsReferenceSelectedSendEmail. The name implies that the method will identify if the user selected reference in the grid is SendEmail. What the method really does is iterate over all the references and identifies if any one of them is SendEmail.

Simple solution. Alias the method as AnyReferenceIsSendEmail so that future code will read properly: if ( AnyReferenceIsSendEmail() )...

Now, if we can just get a keyword "unless" to negate an if condition.

IMO

Upvotes: 10

Brian
Brian

Reputation: 249

This works.

class Program
{
    delegate void B();
    static Test t = new Test();
    static B b = t.A;

    static void Main(string[] args)
    {
        b();
    }

}

class Test
{
    public void A()
    {
    }
}

Upvotes: 2

Anton Semenov
Anton Semenov

Reputation: 6347

C# is object oriented language, so you cant create "alias for function". You can only manipulate with classes. As it was mentioned, you can extend class with extension method, you also can create derived class and create new method in it, which would call derived method:

    class Test
    {
        public void A()
        {
            MessageBox.Show("Function A");
        }
    }

    class Test2: Test
    {
        public void B()
        {
            A();
        }
    }

But if you desire to call B() on your initial class Test you have only one way - creation of extension method.

Upvotes: 1

Cheeso
Cheeso

Reputation: 192517

You can use an extension method

public static class Extensions 
{
    public static void B(this Test t)
    {
       t.A();
    }
}

But it is not an alias. It is a wrapper.


EDIT
ps: I agree with the commenters on your question that we'd be able to give better answers if we knew what you really wanted to do, if we understood the problem you're trying to solve.

I don't really see the point of producing the above extension method.

Upvotes: 13

Teoman Soygul
Teoman Soygul

Reputation: 25742

Actually function aliases are more of delegates in C# terminology (like function pointers in C++). Here is one:

public class Test
{
    public void Test()
    {
        B += A;
    }

    public void A()
    {
        ...
    }

    public Action B;
}

But you'll have to call this as B.Invoke() as it is parameterless. If it had one or more parameters, this wouldn't be a problem.

Upvotes: 5

Related Questions