Рассмотрим сделать класс ComboFunc
текучим интерфейс на нем, так что вы можете сделать ...
вар п = новый ComboFunc() А ("arg1 ") .B (" арг2 ") С (." arg3"); var result = fn.Apply ("arg4");
Свободный интерфейс в классе ComboFunc можно использовать для создания внутренней функциональной цепочки, которую вы затем выполняете. B(), например, будет цепной функцией b() в цепочке Func внутри и возвращать новый объект ComboFunc().
Это дает вам (a) чистый синтаксис; (б) возможность задавать правила, которые ограничивают время разработки, какие функции можно назвать на вершине которой другие (вернув другой тип.
Что-то вроде ...
public abstract class ComboFuncBase
{
protected Func<string,string> chain = x => x; // start with identity operation
// Here are your various functions ... defined as methods or as functions like this ..
protected Func<string, string> Afunc = input => input + "A";
protected Func<string, string> Bfunc = input => input + "B";
protected Func<string, string> Cfunc = input => input + "C";
/// <summary>
/// Execute the chain of functions
/// </summary>
public string Apply(string argument)
{
return chain(argument);
}
/// <summary>
/// Apply FunctionC - always available
/// </summary>
public ComboFuncWithC C(string sz)
{
return new ComboFuncWithC() { chain = x => Cfunc(chain(x)) };
}
}
/// <summary>
/// A chain without a C in it yet allows A's and B's
/// </summary>
public class ComboFunc : ComboFuncBase
{
/// <summary>
/// Apply FunctionA
/// </summary>
public ComboFunc A(string sz)
{
return new ComboFunc() { chain = x => Afunc(chain(x)) };
}
/// <summary>
/// Apply FunctionB
/// </summary>
public ComboFunc B(string sz)
{
return new ComboFunc() { chain = x => Bfunc(chain(x)) };
}
}
/// <summary>
/// After C has been applied you can't apply A or B
/// </summary>
public class ComboFuncWithC : ComboFuncBase
{
}
static void Main(string[] args)
{
string input = "hello";
var combo = new ComboFunc().A(" world").B("!").C(" - see");
// Intellisense/Compiler will not allow this ...
//var combo2 = new ComboFuncBase.ComboFunc().A(" world").C("!").B(" - see");
То, что у вас есть, называется продолжением, и это не плохая идея. – erikkallen