C# 扩展方法编译器优先级

C# 扩展方法编译器优先级,c#,.net,C#,.net,我的客户提出了一个奇怪的要求,即对于项目代码中的每个.ToString()调用,我们都应该执行一个自定义操作(比如在db中添加一行) 我觉得扩展方法对我来说非常有用,如果它能为我提供覆盖功能的话 Microsoft为什么不允许扩展方法重写类方法的现有行为 我听说编译器对扩展方法的优先级比类方法低。有没有一种方法可以将编译器修改为优先于类方法的扩展方法 有没有一种方法可以修改编译器以使扩展方法更具优先级 而不是类方法 不,你不能 我想引用埃里克·利珀特(Eric Lippert)的一句类似的话:

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

我觉得扩展方法对我来说非常有用,如果它能为我提供覆盖功能的话

Microsoft为什么不允许扩展方法重写类方法的现有行为

我听说编译器对扩展方法的优先级比类方法低。有没有一种方法可以将编译器修改为优先于类方法的扩展方法

有没有一种方法可以修改编译器以使扩展方法更具优先级 而不是类方法

不,你不能

我想引用埃里克·利珀特(Eric Lippert)的一句类似的话:

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

发件人:

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

有没有一种方法可以修改编译器以使扩展方法更具优先级 而不是类方法

不,你不能

我想引用埃里克·利珀特(Eric Lippert)的一句类似的话:

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

发件人:

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


实际上,扩展本身存在一个问题。 因为实例的ToString()方法将优先于扩展

简言之:

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() ;
    }
}
将返回测试


你或许应该试试另一种方法。可能是代理对象或其他类似的东西。

实际上扩展本身存在问题。 因为实例的ToString()方法将优先于扩展

简言之:

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() ;
    }
}
将返回测试


你或许应该试试另一种方法。可能是代理对象或那个方向的东西。

这是一个非常奇怪的要求。我建议你干脆往后推。(客户端是否希望每次对ToString的隐式调用都有这种行为,例如字符串连接?在.NET framework代码中对ToString的调用如何?)我同意。教育你的客户。这也是你作为顾问工作的一部分。我也同意这一点:)。。谢谢你的评论。这可能是一本向你的客户解释的好读物!我没有意识到这一点…很大的一部分。。超级喜欢……这真是一个奇怪的要求。我建议你干脆往后推。(客户端是否希望每次对ToString的隐式调用都有这种行为,例如字符串连接?在.NET framework代码中对ToString的调用如何?)我同意。教育你的客户。这也是你作为顾问工作的一部分。我也同意这一点:)。。谢谢你的评论。这可能是一本向你的客户解释的好读物!我没有意识到这一点…很大的一部分。。超级喜欢。。