Просто отказ от ответственности Я очень новичок в методах расширения и не знаю, с чем связаны «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, если это необходимо.
Существует несколько решений, таких как использование интерфейса, так как его, вероятно, следует использовать, и создать метод getLocation() в каждом из классов, реализующих IFoo, но есть около 4-5 из них, и это кажется мне нечистым ,
В любом случае, что бы вы предложили как лучшее/чистое/простое в обслуживании решение того, чего я пытаюсь достичь?
Благодаря
EDIT: Этот вопрос похож на: How to override an existing extension method Однако данный ответ не достаточно для меня, как я называю метод расширения внутри ссылочной библиотеки, а не основное приложение поэтому я не могу идти
using PrimaryApplication
{
}
Редактировать: В комментариях icemaninid комментарии и явно не дублируются, учитывая, что ответ не совпадает с ответом на другой поток.
Поскольку они являются статическими, вы не можете сделать их виртуальными. Однако посмотрите на принятый ответ здесь для «обходного пути»: http://stackoverflow.com/questions/1451099/how-to-override-an-existing-extension-method – Icemanind
@icemanind, как бы вы предложили реализовать этот обходной путь ? Метод расширения вызывается внутри ссылочной библиотеки, которая не ссылается на основное приложение. – Adrian773
Возможно, методы расширения - это не путь. Возможно, вы должны сделать это подкласс. Попробуйте создать новый класс в вашей программе, который наследует этот другой класс. – Icemanind