开发者

creating an alias for a function name in C#

开发者 https://www.devze.com 2023-03-07 10:11 出处:网络
I want to create an alias for a funcion name in C#. Is there any way but function overloading? public class Test

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 belo开发者_如何学Cw.

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


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;
}


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.


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


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.


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.


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()
    {
    }
}


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);
}


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

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号