【问题标题】:extension method compiler priority扩展方法编译器优先级
【发布时间】:2013-02-14 07:12:33
【问题描述】:

我的客户提出了一个奇怪的要求,即对于项目代码中的每个 .ToString() 调用,我们都应该进行自定义操作(例如在 db 中添加一行)

我觉得扩展方法对我来说非常有用,如果它为我提供了覆盖工具。

为什么微软不允许扩展方法覆盖类方法的现有行为?

我听说编译器将扩​​展方法的优先级低于类方法。有没有办法将编译器修改为优先于扩展方法而不是类方法?

【问题讨论】:

  • 这是一个真的奇怪的要求。我建议你简单地推回它。 (客户端是否希望每次对 ToString 的 隐式 调用都具有这种行为,例如在字符串连接中?在 .NET 框架代码中对 ToString 的调用呢?)
  • 我同意。教育你的客户。这也是您作为顾问工作的一部分。
  • 我也同意这一点 :).. 感谢您的 cmets..
  • 这可能是向您的客户解释的好读物codinghorror.com/blog/2008/07/monkeypatching-for-humans.html
  • 瞧!我不知道这个..很棒的分享..超级喜欢..

标签: c# .net


【解决方案1】:

有没有办法将编译器修改为优先级扩展方法更多 比类方法?

不,你不能。

我会引用类似 question 的 Eric Lippert 的话:

扩展方法的目的是扩展方法集 在一个类型上可用,而不是覆盖现有方法;这就是为什么 它们被称为“扩展方法”

来自MSDN - Extension Method

你可以使用扩展方法扩展一个类或接口,但是 不要覆盖它们。具有相同名称的扩展方法和 永远不会调用作为接口或类方法的签名。

【讨论】:

    【解决方案2】:

    其实扩展本身就有问题。 因为实例的 ToString() 方法会优先于扩展。

    a good explanation on the Microsoft Developer Network

    简而言之:

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string value = "test";
                Console.WriteLine(value.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            Console.WriteLine("End");
            Console.Read();
        }
    }
    public static class StaticExtensions
    {
        public static string ToString(this Object obj)
        {
            if (obj == null)
                return "";
            else
                return obj.GetType().FullName + obj.ToString() ;
        }
    }
    

    将返回测试。

    您可能应该尝试另一种方式。也许是代理对象或那个方向的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      相关资源
      最近更新 更多