我想在C#中为函数名创建一个别名。
除了函数重载有什么办法吗?
public class Test
{
public void A()
{
...
}
}
我想在下面打电话给B替换A.
var test = new Test();
test.B();
你可以使用extension method
public static class Extensions
{
public static void B(this Test t)
{
t.A();
}
}
但它不是别名。这是一个包装。
编辑 ps:我同意你的问题的评论者,如果我们知道你真正想做什么,如果我们理解你想要解决的问题,我们就能给出更好的答案。
我真的没有看到产生上述扩展方法的重点。
没有人提到过,我很惊讶 代表们。它可能与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;
}
实际上,函数别名更多是C#术语中的委托(就像C ++中的函数指针一样)。这是一个:
public class Test
{
public void Test()
{
B += A;
}
public void A()
{
...
}
public Action B;
}
但是你必须将它称为B.Invoke(),因为它是无参数的。如果它有一个或多个参数,这不会是一个问题。
这是如此陈旧,但我对一个人为什么想要为方法名称添加别名有一个回应。它一直在发生。因为某些开发人员给了一个方法一个没有任何意义的名称,或者它根本没有准确地描述该方法的目的。在旧的,经过良好调整的解决方案中,该方法被多次调用。因此,执行大型重构和重新测试是因为命名不合理的方法无法证明,只需给它一个有意义的别名。这样,新代码将来会正确读取。
即保存网格控件,并且方法名称为IsReferenceSelectedSendEmail。该名称暗示该方法将识别用户在网格中选择的引用是否是SendEmail。该方法真正做的是迭代所有引用,并确定它们中的任何一个是否是SendEmail。
简单解决方案将该方法别名为AnyReferenceIsSendEmail,以便将来的代码正确读取:if(AnyReferenceIsSendEmail())...
现在,如果我们可以获得关键字“除非”否定if条件。
IMO
C#是面向对象的语言,因此您无法创建“函数别名”。你只能操纵类。正如前面提到的,你可以使用扩展方法扩展类,你也可以创建派生类并在其中创建新方法,这将调用派生方法:
class Test
{
public void A()
{
MessageBox.Show("Function A");
}
}
class Test2: Test
{
public void B()
{
A();
}
}
但是如果你想在你的初级课程B()
上调用Test
你只有一种方法 - 创建扩展方法。
这有效。
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()
{
}
}