2016-03-09 9 views
2
  1. Это простой способ сделать такой код проще? Да, я знаю, что код в комментарии может быть извлечен как метод, но это немного запутывает, чтобы записывать такие две перегрузки каждый раз. Обратите внимание, что могут быть другие параметры, кроме functor, в функции, такой как DoSomething.Как упростить код с двумя перегрузками функции, которые получают Func и Action в качестве параметра?

    Result DoSomething<Result>(Func<Parameter, Result> functor) 
    { 
        // do something to construct argument 
        return functor(argument); 
    } 
    
    void DoSomething(Action<Parameter> functor) 
    { 
        // do something to construct argument 
        functor(argument); 
    } 
    
  2. Более сложный вариант. Как достичь такого же результата без дублирования кода, если вызов functor находится внутри блока using?

На самом деле я хочу найти C# альтернативу коды C++ 14, как

template <class Functor> 
auto DoSomething(Functor functor) 
{ 
    // do something... 
    return functor(argument); 
} 
+0

Похоже, что 'аргумент' не объявлен. – abelenky

+1

@abelenky Предположим, что он объявлен внутри блока '// do something ... 'кода. – Constructor

+3

Ну, вы можете называть DoSomething (p => {action (p); return 1;}); 'и игнорировать возвращаемое значение, чтобы заставить' Action' работать в перегрузке 'Func'. – juharr

ответ

1

Ну, вы могли бы создать FuncWrapper<Parameter, Result> общий класс с неявными преобразованиями из Func<Parameter, Result> и Action<Parameter> и Call(Parameter) которая выполняет фактический вызов.

FuncWrapper может иметь два члена (с Func < ...> и Action < ...>) и вызвать через один, который не является нулевым, или вы можете обернуть Action < ...> с лямбда-выражения, которые по существу превращает его в Func < ...> (вызов действия, возврата по умолчанию (результат))

Тогда можно определить только одну функцию в своем классе:

Result DoSomething(FuncWrapper<Parameter, Result> wrapper) 
{ 
    // Find argument 
    return wrapper.Call(argument); 
} 

Ваш FuncWrapper класс должен return default(Result) значение в случае Action<Parameter> ,

+0

Интересно. Спасибо. Почему * .NET * отсутствует такой класс «FuncWrapper»? – Constructor

+0

Не могли бы вы объяснить, как хранить информацию о реальном типе 'FuncWrapper' между его конструкцией и вызовом метода' Call'? – Constructor

+0

Наверное, потому что это довольно запутанно, такие неявные преобразования скрывают то, что действительно происходит. – zmbq

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

  • Нет связанных вопросов^_^