2015-01-16 2 views
1

Просто отказ от ответственности Я очень новичок в методах расширения и не знаю, с чем связаны «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 комментарии и явно не дублируются, учитывая, что ответ не совпадает с ответом на другой поток.

+1

Поскольку они являются статическими, вы не можете сделать их виртуальными. Однако посмотрите на принятый ответ здесь для «обходного пути»: http://stackoverflow.com/questions/1451099/how-to-override-an-existing-extension-method – Icemanind

+0

@icemanind, как бы вы предложили реализовать этот обходной путь ? Метод расширения вызывается внутри ссылочной библиотеки, которая не ссылается на основное приложение. – Adrian773

+0

Возможно, методы расширения - это не путь. Возможно, вы должны сделать это подкласс. Попробуйте создать новый класс в вашей программе, который наследует этот другой класс. – Icemanind

ответ

2

Вы не можете переопределить метод расширения. Это статические методы, разрешенные во время компиляции, а не во время выполнения.

Смежные вопросы