2012-06-05 4 views
2

У меня есть список методов, которые делают почти то же самое, за исключением нескольких отличий:Pass код метода в качестве аргумента

void DoWork(string parameter1, string parameter2) 

{ 

//Common code 
... 

//Custom code 
... 

//Common code 
... 

} 

Я хочу, чтобы упростить решение с повторным использованием общего кода, передавая пользовательский код от другого метода.

Я предполагаю, что для этого я должен использовать действие с параметрами, но не могу понять, как это сделать.

+4

Вы будете иметь, чтобы дать более полный пример, чем получить любую помощь. – cadrell0

+0

Честно говоря, трудно дать точный ответ, когда вы не предоставили достаточной информации, ** мы просто пытаемся угадать, что может быть правильным ответом для вас на основе предположений **, если бы вы могли предоставить больше контекста, было бы здорово =) – Jupaol

ответ

1

Другие ответы велики, но вы, возможно, придется вернуть что-то из пользовательского кода, так что вам нужно будет использовать Func вместо этого.

void Something(int p1, int p2, Func<string, int> fn) 
{ 
    var num = p1 + p2 + fn("whatever"); 
    // . . . 
} 

Зов это следующим образом:

Something(1,2, x => { ...; return 1; }); 

Или:

int MyFunc(string x) 
{ 
    return 1; 
} 

Something(1,2 MyFunc); 
1

Чтобы использовать это, вы должны использовать delegates. Это, скорее всего, выглядеть так:

void DoWork(string parameter1, string parameter2, Action<string,string> customCode) 
{ 
    // ... Common code 
    customCode(parameter1, parameter2); 
    // ... Common code 
    customCode(parameter1, parameter2); 
    // ... Common code 
} 
1

Если пользовательский код не должен взаимодействовать с общим кодом, это легко:

void DoWork(..., Action custom) 
{ 
    ... Common Code ... 
    custom(); 
    ... Common Code ... 
} 
1

Предполагая, что вы должны использовать два параметра строки в пользовательский код должен выполнить следующую работу. Если вы действительно не заботитесь о результатах пользовательского кода, вы можете заменить Func<string, string, TResult> на Action<string, string>. Кроме того, если ваш пользовательский код должен обрабатывать результаты из общего кода выше него, вы можете настроить типы параметров, которые принимает ваш Func <> (или действие <>), а затем передать соответствующие значения.

void DoWork(string parameter1, string parameter2, Func<string, string, TResult> customCode) { 
    //Common code 
    var customResult = customCode(parameter1, parameter2); 
    //Common code 
} 

Использование Func<T, TResult>: http://msdn.microsoft.com/en-us/library/bb534960

Использование Action<T>: http://msdn.microsoft.com/en-us/library/018hxwa8

2

Вы можете попробовать Template method pattern

Что в основном говорится soemthing как этот

abstract class Parent 
{ 
    public virtual void DoWork(...common arguments...) 
    { 
     // ...common flow 
     this.CustomWork(); 
     // ...more common flow 
    } 

    // the Customwork method must be overridden 
    protected abstract void CustomWork(); 
} 

В дочернем классе

class Child : Parent 
{ 
    protected override void CustomWork() 
    { 
     // do you specialized work 
    } 
} 
Смежные вопросы