扩展方法编译优先级

时间:2013-02-14 07:12:33

标签: c# .net

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

我认为扩展方法对我来说非常有用,如果它能为我提供最重要的设施。

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

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

2 个答案:

答案 0 :(得分:7)

  

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

不,你不能。

我会引用Eric Lippert的类似question

  

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

来自MSDN - Extension Method

  

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

答案 1 :(得分: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() ;
    }
}

将返回测试。

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