2013-02-14 57 views
1

我的客户想出了在项目代码的每个的ToString()调用,我们应该做一个定制的操作(如添加在数据库中的行)扩展方法编译优先

我觉得扩展方法奇怪的要求对我来说会非常有用,如果它为我提供了压倒性的设施。

Microsoft为什么不允许扩展方法覆盖类方法的现有行为的任何原因?

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

+4

这是一个*真*奇怪的要求。我建议你简单地推回去。 (客户端是否希望这种行为对于ToString的每个* implicit *调用,例如在字符串连接中?那么在.NET框架代码中调用ToString怎么样?) – 2013-02-14 07:17:36

+1

我同意。教育你的客户。这也是你作为顾问工作的一部分。 – 2013-02-14 07:18:09

+0

我也同意这个:) ..谢谢你的评论.. – 2013-02-14 07:23:31

回答

7

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

不,你不能。

我会从类似question引述埃里克利珀:

的扩展方法的目的是延长该组的类型可用的方法 ,不重写现有的方法;这就是为什么 他们是所谓的“扩展方法”

MSDN - Extension Method

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

1

实际上,扩展本身存在问题。 因为实例的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() ; 
    } 
} 

将返回测试。

你应该尝试另一种方式。也许代理对象或某个东西在那个方向。