2010-11-04 2 views
0

Я хочу переопределить метод Print of ClassA в пользовательской dll.«метод переопределения во время выполнения» C#

public ClassA 
{ 
    public void Print(string arg1, string arg2, string arg3, string arg4) 
    { 
    } 
} 

Возможно ли это в C#?

+1

Просьба уточнить: Вы хотите отменить/тень/скрыть метод иностранного класса ? И вы действительно хотите это сделать во время выполнения *, а не * время разработки *? – Bobby

+0

@Bobby: Shadowing не поможет одному бит во время выполнения. Он разрешается во время компиляции. – leppie

+0

@leppie: Вот почему я спросил, что он * действительно хочет делать. – Bobby

ответ

0

Ваша первая проблема: метод не отмечен virtual. Вы не можете использовать override не виртуальный метод.

Что касается вопроса, все зависит от того, как создается и используется ClassA. Вы можете, например, создать производный тип во время выполнения, если вы можете контролировать его создание и использование.

1

Я считаю, что Moles из Microsoft Research делает что-то подобное. У них есть система, которая позволяет вам переопределить работу, например. DateTime.Now, заставляя его возвращать определенную дату/время.

Для получения дополнительной информации см. http://research.microsoft.com/en-us/projects/pex/default.aspx.

+0

Moles делает это, а не Pex – Kikaimaru

+0

Спасибо, обновленный ответ. –

1

Это не совсем то же самое, как вы просите, но это достигается подобный эффект ...

Почему бы не определить интерфейс для операций. ClassA реализует интерфейс. Ваши пользовательские стратегии также реализуют интерфейс. ClassA внутренне создает «по умолчанию» реализацию интерфейса при запуске (когда экземпляр ClassA создается), но также имеет свойство, позволяющее установить интерфейс. Интерфейс может даже позволить пользовательской стратегии, чтобы указать, какие члены интерфейса, что он на самом деле реализует:

interface IStrategy 
{ 
    void Operation1(int x, int y); 
    void Operation2(string a, string b); 
} 

class ClassA : IStrategy 
{ 
    private IStrategy builtInStrategy = new BuiltInStrategy(); 

    public IStrategy CustomStrategy { get; set; } 

    void Operation1(int x, int y); 
    { 
    if (CustomStrategy != null) 
    { 
     CustomStrategy.Operation1(x, y); 
    } 
    else 
    { 
     builtInStrategy.Operation1(x, y); 
    } 
    } 

    void Operation2(string a, string b) 
    { 
    if (CustomStrategy != null) 
    { 
     CustomStrategy.Operation2(a, b); 
    } 
    else 
    { 
     builtInStrategy.Operation2(a, b); 
    } 
    } 
} 

Вы можете указать в качестве части IStrategy интерфейса путь для пользовательской стратегии, чтобы указать, что это не «наиважнейшая «конкретная операция. Возможно, он мог бы вернуть bool, а не пустоту, или, возможно, каждая операция может иметь параметр out bool, для которого установлено значение «ложь», если пользовательская стратегия не переопределила операцию.

В зависимости от того, сколько операций можно переопределить, вы можете даже рассмотреть возможность включения каждой операции в свой собственный интерфейс. Операции могут быть сгруппированы в интерфейсе, если нецелесообразно реализовывать одну операцию, не выполняя некоторые другие операции.

interface IOperation1 
{ 
    void Operation1(int x, int y); 
} 

interface IOperation2 
{ 
    void Operation2(string a, string b); 
} 

interface IMath 
{ 
    int Add(int i, int j); 
    int Subtract(int i, int j); 
    int Multiply(int i, int j); 
    int Divide(int i, int j); 
} 

interface IStrategy 
{ 
    //What operations should the Strategy have? 
} 

class ClassA : IOperation1, IOperation2, IMath 
{ 
    public IStrategy CustomStrategy { get; set; } 

    public void Operation1(int x, int y) 
    { 
    IOperation1 op1 = CustomStrategy as IOperation1; 
    if (op1 != null) 
    { 
     op1.Operation1(x, y); 
    } 
    else 
    { 
     //Do ClassA's Operation1 logic here 
    } 
    } 

    public void Operation2(string a, string b) 
    { 
    IOperation2 op2 = CustomStrategy as IOperation2; 
    if (op2 != null) 
    { 
     op2.Operation2(a, b); 
    } 
    else 
    { 
     //Do ClassA's Operation2 logic here 
    } 
    } 

    // 
    // And so on ... 
    // 
} 
0

Это не возможно, потому что я не могу продлить CLASSA, потому что в Основном DLL поставляется с приложением

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