Tubo para a frente em C #

Continuandominha investigação de expressar idéias de F # em C #, eu queria um operador de encaminhamento de canal. Para qualquer coisa envolvida em um IEnumerable, já o temos, como você pode .NextFunc () no conteúdo do seu coração. Mas, por exemplo, se você tiver alguma redução de dobra no final, não poderá alimentar o resultado disso em uma função.

Aqui estão dois métodos de extensão, eu me perguntei se alguém havia tentado isso e se é uma boa ideia ou não (EDIT: agora comTalvez de Earwicker incluído):

public static void Pipe<T>(this T val, Action<T> action) where T : class
{ if (val!=null) action(val); }

public static R Pipe<T, R>(this T val, Func<T, R> func) where T : class where R : class
{ return val!=null?func(val):null; }

Você pode escrever algo como:

Func<string, string[]> readlines = (f) => File.ReadAllLines(f);
Action<string, string> writefile = (f, s) => File.WriteAllText(f, s);

Action<string, string> RemoveLinesContaining = (file, text) =>
    {
        file.Pipe(readlines)
            .Filter(s => !s.Contains(text))
            .Fold((val, sb) => sb.AppendLine(val), new StringBuilder())
            .Pipe((o) => o.ToString())
            .Pipe((s) => writefile(file, s));
    };

(Eu sei, Filter == Where in C # e Fold == Aggregate, mas eu queria fazer o meu próprio, e eu poderia ter feito WriteAllLines, mas esse não é o ponto)

EDIT: correções de acordo com o comentário de Earwicker (se eu entendi corretamente).