【问题标题】:How to call extension method which has the same name as an existing method? [duplicate]如何调用与现有方法同名的扩展方法? [复制]
【发布时间】:2012-11-23 06:55:29
【问题描述】:

我有类似的代码

public class TestA
{
    public string ColA { get; set; }
    public string ColB { get; set; }
    public string ColC { get; set; }
    public void MethodA()
    {
        MessageBox.Show("Original A1.");
    }
}

static class ExtenstionTest
{
  
    public static void MethodA(this TestA A1)
    {
        MessageBox.Show("Extended A1.");
    }
}

现在如果我像这样调用 MethodA

TestA a = new TestA();
        a.MethodA();

它总是会调用 Original 方法。如何调用扩展方法。

【问题讨论】:

标签: c# extension-methods


【解决方案1】:

您不能像普通的扩展方法一样调用扩展方法。实例方法覆盖同签名的扩展方法

编辑:

你可以调用它作为一个静态方法

ExtensionTest.MethodA(a);

【讨论】:

  • 那不会解决我的问题。但感谢您的回答..
  • 不客气。这个想法是,如果您想将扩展方法用作真正的扩展方法,如果您有具有相同签名的实例方法,则不能使用它,因为该实例方法将始终优先于扩展方法:)跨度>
  • +1 是第一个正确答案,惊讶地看到它被否决
  • 我想我知道谁投了反对票:P
【解决方案2】:

您不能将其称为 扩展方法。就作为一种扩展方法而言,它在这一点上基本上是无用的。 (我个人希望这是一个警告,但没关系。)

编译器在尝试解析扩展方法之前会尝试所有可能的instance 方法。来自 C# 4 规范的第 7.6.5.2 节:

在一种形式的方法调用中 [...] 如果调用的正常处理未找到适用的方法,则会尝试将构造作为扩展方法调用进行处理。

及以后:

上述规则意味着实例方法优先于扩展方法

你可以像普通的静态方法一样调用它:

// Fixed typo in name
ExtensionTest.MethodA(a);

【讨论】:

    【解决方案3】:

    Extension Methods - MSDN

    具有相同名称和签名的扩展方法作为 接口或类方法永远不会被调用。在编译时, 扩展方法的优先级总是低于类型本身定义的实例方法

    您可以将扩展方法称为类的常规静态方法。

    ExtenstionTest.MethodA(a);
    

    来自MSDN

    换句话说,如果一个类型有一个名为 Process(int i) 的方法,而你 具有相同签名的扩展方法,编译器将 始终绑定到实例方法。当编译器遇到 方法调用,它首先在类型的实例中查找匹配项 方法。如果没有找到匹配项,它将搜索任何扩展名 为该类型定义并绑定到第一个扩展的方法 它找到的方法。下面的例子演示了如何 编译器确定要绑定的扩展方法或实例方法 到。

    【讨论】:

      【解决方案4】:

      您可以像调用任何其他静态方法一样调用扩展方法:

      ExtenstionTest.MethodA(a);
      

      【讨论】:

        【解决方案5】:

        正如其他人建议的那样,您不能调用此方法。调用它的唯一方法是:

        TestA a = new TestA();
        ExtenstionTest.MethodA(a);
        

        【讨论】:

        • 如果其他人已经提出了建议,那么在不带来任何新内容的情况下发布相同的答案有什么意义?
        • 为你+1。上面的新东西是“唯一的方法”:)
        • 是的。但是其他人都已经说过了
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-14
        • 1970-01-01
        • 2014-07-10
        • 1970-01-01
        • 1970-01-01
        • 2015-02-27
        • 1970-01-01
        相关资源
        最近更新 更多