我最近一直在研究函数式编程,并希望将一些概念带入我的C#世界。我正在尝试组合函数来创建服务(或任何您称之为服务的东西),而不是创建具有可注入依赖项的类。
我想出了一种方法,通过创建这样的静态方法来部分应用具有两个参数和一个返回参数的函数(具有与注入依赖项相同的效果):
// this makes a func with a single arg from a func with two
static Func<T2, TResult> PartiallyApply<T1, T2, TResult>(
Func<T1,T2, TResult> f,
T1 t1)
{
// use given t1 argument to create a new function
Func<T2, TResult> map = t2 => f(t1, t2);
return map;
}
这有效,但是我想传递一个静态方法,如下所示:
static string MakeName(string a, string b) => a + " " + b;
当我尝试连接它时,我收到错误The type arguments for method 'Program.PartiallyApply<T1, T2, TResult>(Func<T1, T2, TResult>, T1)' cannot be inferred from the usage.但是当我添加一个创建显式的步骤时Func<string,string,string,我指向它确实工作的方法:
static void Main(string[] args)
{
var first = "John";
var last = "Doe";
var f1 = PartiallyApply(MakeName, first); // cannot be inferred from the usage
Func<string, string, string> make = MakeName; // map it to func
var f2 = PartiallyApply(make, first); // works
var name = f2(last);
Console.WriteLine(name);
Console.ReadKey();
}
直接传递静态方法时,为什么编译器不能算出类型args?有没有一种方法可以使用静态方法,而无需将它们显式映射到Func<>具有基本相同(类型)参数的 a ?
UPDATE Reading Functional programming in C#by Enrico Buonanno(强烈推荐)为解决这个问题提供了另一个不错的选择。在7.1.3他提供了几个关于如何Funcs直接使用而不是方法组的选项。你可以用这样的方式创建一个只有 getter 的属性Func:
static Func<string, string, string> MakeName => (a,b) => a + " " + b;
相关分类