如何覆盖扩展方法?

时间:2015-01-16 04:17:52

标签: c#

只是一个免责声明我对扩展方法很新,并不真正知道与它们相关的“Dos and Don'ts”,我怀疑我要做的是不要如果它只是建议对我的代码进行潜在的重组可能会有效。

好的,所以解释我想要做的最好的方法是通过代码示例。

namespace ReferencedLibrary
{
     public class Bar
    {
        public Bar(IFoo foo)
        {
            foo.GetLocation();
        }
    }
    public interface IFoo { }
    public static ExtensionMethods
    {
        public static void GetLocation(this IFoo foo){throw new Exception("ERROR: This should not be called.....");}
    }

}
namespace PrimaryApplication
{
    public class MainController
    {
        Bar bar = new Bar(aClassThatImplementsIFoo);
    }
    public static class OtherExtensionMethods
    {
        public static void GetLocation(this IFoo foo)
        {
            Console.WriteLine("Hello World");
        }
        public static void GetWheelConfiguration(this IFoo foo)
        {
            Console.WriteLine("Hello World");
        }
    }
    //This is an example of the inheritance structure of the data I'm using and is unchangeable no matter what.
    public class Vehicle {}
    public class Car : Vehicle {}
    public class Toyota : Car {}
    public class Holden : Car, IFoo {}

    public class Bike : Vehicle IFoo {}
}

我正在尝试使用别人的代码,我希望能够保存在单独的项目中并引用dll。我也想避免过多地修改这段代码。如果需要,我可以根据需要简单地将它带入PrimaryApplication。

有一些解决方案,比如使用接口,因为它可能应该使用,并在每个实现IFoo的类中创建一个方法getLocation(),但是大约有4-5个,这对我来说似乎是不洁净的。

无论如何,您认为什么是我试图实现的最好/最干净/最容易维护的解决方案?

由于

编辑:此问题类似于:How to override an existing extension method 然而,给定的答案对我来说是不够的,因为我从引用的库中调用扩展方法,而不是主应用程序因此我不能去

using PrimaryApplication
{

}

编辑:这个问题已由评论中的icemaninid回答,并且考虑到答案与其他帖子的答案不同,显然不重复。

1 个答案:

答案 0 :(得分:2)

您无法覆盖扩展方法。它们是在编译时解析的静态方法,而不是在运行时解析。