Просто отказ от ответственности Я очень новичок в методах расширения и не знаю, что с ними связано "Дос и Дон", и я подозреваю, что я пытаюсь сделать это не так, если просто предложить потенциальную реструктуризацию к моему коду, который сработает.
Хорошо, поэтому лучший способ объяснить, что я хочу сделать, - это пример кода.
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, если это необходимо.
Существует несколько решений, таких как использование интерфейса, поскольку он, вероятно, следует использовать, и создать метод getLocation() в каждом из классов, которые реализуют IFoo, однако их около 4-5, и это кажется мне нечистым.
В любом случае, что бы вы предложили как лучшее/чистое/простое в обслуживании решение того, чего я пытаюсь достичь?
благодаря
EDIT: этот вопрос аналогичен: Как переопределить существующий метод расширения. Однако данный ответ мне недостаточен, поскольку я вызываю метод расширения из библиотеки ссылок, а не основное приложение, поэтому я не могу пойти
using PrimaryApplication
{
}
Редактировать: на этот вопрос ответил icemaninid в комментариях и явно не дублируется, учитывая, что ответ не совпадает с ответом на другой поток.
Вы не можете переопределить метод расширения. Это статические методы, разрешенные во время компиляции, а не во время выполнения.