我已编写some extension Methods将IEnumerable和IList转换为字符串。现在,由于IList继承自IEnumerable,我必须以不同的方式命名它们。
我只是想知道是否有办法避免这种情况? 我可以在IEnumerable上使用扩展方法,然后在具有相同名称和相同签名的IList上使用另一个方法吗?有点像覆盖,除了扩展方法当然是静态的。
我只想在List上使用更有效的方法体,而不必使用第二个方法名称。
是的,我知道在这个特定的情况下,我应该首先运行一个探查器,以确定第二种方法是否更好,但我很感兴趣,如果它通常可以覆盖派生类中的扩展方法。
答案 0 :(得分:5)
你为什么不做BCL所做的事情,并尝试在同一方法中进行预测?
有点像这样:
public static string Foo<T>(this IEnumerable<T> source)
{
var list = source as IList<T>;
if(list != null)
{
// use more efficient algorithm and return
}
// default to basic algorithm
}
如果你绝对必须有两个具有相同名称的独立扩展方法,你可以将它们放在两个不同命名空间的类中,但这意味着你永远不能在同一个代码中使用它们文件,这几乎不是最佳的。
答案 1 :(得分:4)
Daniel Cazzulino最近发表了关于模拟扩展方法的博客,并在帖子中描述了他的方法,不仅将类似命名空间的分组应用于相关的扩展方法,还描述了如何实质上实现扩展属性。 Here's the blog post.内部充满了令人敬畏的精神。
实质上,您将相关方法封装在对象中并从扩展方法返回实例:
public interface ISecurity
{
Permissions GetPermissions(Uri resource);
}
public static class SecurityExtensions
{
public static ISecurity Security(this IPerson person)
{
return new SecurityImpl(person);
}
}
您可以使用此技术“命名”扩展方法。