1

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

我觉得扩展方法对我很有用,如果它为我提供了压倒一切的设施。

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

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

4

2 回答 2

7

有没有办法将编译器修改为优先于扩展方法而不是类方法?

不,你不能。

我会从类似的问题中引用 Eric Lippert 的话:

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

来自MSDN - 扩展方法

您可以使用扩展方法来扩展类或接口,但不能覆盖它们。永远不会调用与接口或类方法具有相同名称和签名的扩展方法。

于 2013-02-14T07:14:58.317 回答
1

实际上,扩展本身存在问题。因为实例的 ToString() 方法将具有扩展性。

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() ;
    }
}

将返回测试。

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

于 2013-02-14T07:35:50.007 回答