2009-05-22 142 views
88

有些场合我想用扩展方法重写类中的方法。有没有办法在C#中做到这一点?C#中有什么方法可以用扩展方法覆盖类方法吗?

例如:

public static class StringExtension 
{ 
    public static int GetHashCode(this string inStr) 
    { 
     return MyHash(inStr); 
    } 
} 

,我一直想做到这一点的情况是能够将一个字符串的哈希存储到数据库中,并有同样的价值被所有类使用的是使用字符串类的散列(即Dictionary等)。由于内置的​​.Net散列算法不能保证从一个版本的Framework到下一个版本兼容,我想用我自己的替换它。

我还遇到过其他一些情况,我想用一个扩展方法重写一个类方法,所以它不仅仅是特定于字符串类或GetHashCode方法。

我知道我可以通过继承一个现有的类来完成这个工作,但是在很多情况下能够使用扩展来完成这项工作会很方便。

+0

由于字典是内存数据结构,哈希算法是否从框架的版本改变到下一个版本有什么不同?如果框架版本发生变化,那么显然应用程序已重新启动并且字典已重新构建。 – 2009-05-22 19:23:44

回答

83

否;扩展方法永远不会优先于具有适当签名的实例方法,也不会参与多态(GetHashCode是一个virtual方法)。

+0

“......从不参与多态(GetHashCode是一种虚拟方法)”您能否以另一种方式解释为什么一个扩展方法永远不会参与多态,因为它是虚拟的?我在看到与这两个陈述的联系时遇到问题。 – Alex 2014-05-31 06:08:06

6

如果方法有不同的签名,那么它可以完成 - 所以在你的情况下:不。

但除此之外,你需要使用继承来做你正在寻找的东西。

2

据我所知,答案是否定的,因为扩展方法不是一个实例。它更像是一个intellisense设施,让我可以让你使用一个类的实例调用静态方法。 我认为你的问题的解决方案可以是拦截特定方法(例如GetHashCode())的执行的拦截器并执行其他操作。要使用这样的拦截器(就像Castle项目提供的那样),所有对象都应该使用一个对象工厂(或Castle中的一个IoC容器),以便通过在运行时生成的动态代理拦截它们的接口(Caslte也可以让你拦截类的虚拟成员)