2015-12-23 15 views
5

mam metoda A coś takiego: MetodyCzy istnieje sposób ogólny do wywołania innej metody, gdy metoda jest wywoływana w C#

public Something MyMethod() 
{ 
    Setup(); 

    Do something useful... 

    TearDown(); 

    return something; 
} 

konfigurację i przerywaniem są w klasie bazowej.

Problem polega na tym, że muszę wielokrotnie pisać ten typ metody za pomocą wywołań metod Setup() i TearDown().

EDYCJA: Podatkowa część tej metody polega na tym, że "Zrobić coś użytecznego ..." dotyczy tylko tej metody. Ta część jest inna dla każdej metody, którą tworzę.

Ponadto mogę mieć MyMethod2, MyMethod3, w jednej klasie. We wszystkich przypadkach chciałbym uruchomić instalowanie i rozłączanie. Czy istnieje elegancki sposób robienia tego bez konieczności pisania tego za każdym razem?

Być może mam urojenia, ale jest to sposób na dodanie atrybutu do metody i przechwycenie wywołania metody, więc mogę robić rzeczy przed i po wywołaniu?

+1

To jest duplikat mnóstwa pytań. Czy próbowałeś szukać? Możesz używać delegatów, zdarzeń, metod abstrakcyjnych, programowania zorientowanego na aspekt i tak dalej. Na przykład [Uruchom metodę przed wszystkimi metodami klasy] (http://stackoverflow.com/questions/9192709/run-a-method-before-all-metods-of-a-class), [Call base function then then funkcja dziedziczona] (http://stackoverflow.com/questions/3747711/), [Wykonaj kod zanim wywołana funkcja zostanie wykonana] (http://stackoverflow.com/questions/10398530), [Wykonaj metodę przed i po bloku kodu ] (http://stackoverflow.com/questions/26484206/) i tak dalej. – CodeCaster

+2

Chcesz użyć programowania zorientowanego na aspekt. Istnieje wiele narzędzi do tego. –

+1

Dzięki CodeCaster, ale żadne z wspomnień, o których wspomniałeś, nie pomoże w moim przypadku, ponieważ w moim przypadku mogę mieć wiele z tych "MyMethods" w jednej klasie z różnymi nazwami metod, różnymi parametrami i różnymi wartościami zwracanymi. – Steven

Odpowiedz

2

Użyj generics, lambdas i delegates, tak jak:

public SomeThing MyMethod() 
{ 
    return Execute(() => 
    { 
     return new SomeThing(); 
    }); 
} 


public T Execute<T>(Func<T> func) 
{ 
    if (func == null) 
     throw new ArgumentNullException("func"); 

    try 
    { 
     Setup(); 

     return func(); 
    } 
    finally 
    { 
     TearDown(); 
    } 
} 
+0

Prawdopodobnie jest to najbliższy temu, o czym myślałem, ale głównym celem było usunięcie konieczności wielokrotnego zapisywania ustawień/odrzucania. Ten kod usuwa go, ale dodaje dodatkową warstwę kodu. – Steven

+0

Powinieneś przyjrzeć się ramom AOP, jeśli chcesz użyć atrybutów do rozwiązania tego problemu. –

6

Wystarczy wdrożyć tę metodę w abstrakcyjnej klasy bazowej tak:

public Something MyMethod() 
{ 
    Setup(); 

    DoSomethingUsefull(); 

    TearDown(); 

    return something; 
} 

protected abstract DoSomethingUsefull(); 

Teraz trzeba zastąpić tylko jeden sposób, w dziedzicznych klas - DoSomethingUsefull()

Jest to metoda szablonowa

+2

Wzór szablonu - bardzo ładny. – dbugger

+0

Tak, masz rację - wzorzec szablonu –

+3

Zwykle robiłbym 'DoSomethingUseful' chroniony w podobnym przypadku. – pmbanka

Powiązane problemy