如何调用Func并将其传递给构造函数中具有较少参数的另一个Func?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何调用Func并将其传递给构造函数中具有较少参数的另一个Func?相关的知识,希望对你有一定的参考价值。

我有一个看起来像这样的课程

 public class CacheManger<T> where T : class, new()
 {
     public CacheManger(Func<int, T> retriveFunc, Func<List<T>> loadFunc)
    {
        _retriveFunc = retriveFunc;
        _loadFunc = loadFunc;

    }
    public T GetValueByid(int id)
    {
        return _retriveFunc(id);
    }
}

我有另一个课程如下

public class AccountCache 
{

    public AccountCache ()
    {
        CacheManager = new CacheManger<Account>(GetAccount, LoadAcc);
        // LoadAcc is another method that returns a List<Account>
    }

    private Account GetAccount(int accID)
    {
        return CacheManager.CacheStore.FirstOrDefault(o => o.ID == accID);
        //CacheStore is the List<T> in the CacheManager.(internal datastore)
    }

    public Account GetProdServer(int accID)
    {
        return CacheManager.GetValueByid(accID);
    }  
}

现在你可以看到我可以将GetAccount传递给CacheManager的构造函数。现在我有另一个班级,我有这样的方法

public User GetUser(string accountID, int engineID)
{

}

我怎么能把这个函数传递给CacheManager的构造函数。我可以携带函数,但是我怎么能把它作为构造函数参数传递?

我现在在做什么:

private User GetUserInternal(string accountID, int engineID)
{
    return
    /* actual code to get user */
}

private Func<string, Func<int, User>> Curry(Func<string, int, User> function)
{
    return x => y => function(x, y);
}

public UserGetAccount(string accountID, int engineID)
{
    _retriveFunc = Curry(GetUserInternal)(accountID);
    CacheManager.RetrivalFunc = _retriveFunc; //I really dont want to do this. I had to add a public property to CacheManager class for this
    return CacheManager.GetValueByid(engineID);// This will call GetUserInternal
}
答案

你可能想要部分应用而不是currying。我发现的最好方法是创建N个函数,这些函数取自1-N通用参数,然后让编译器选择你想要的那个。如果你看一下我的language-ext项目,我有两个函数,一个叫做curry,一个叫做par用于currying和部分应用:

Currying source

Partial application source

要部分申请,请执行以下操作:

// Example function
int AddFour(int a,int b,int c, int d)
{
    return a + b + c + d;
}

// This returns a Func<int,int,int> with the first two arguments 10 & 5 auto-provided
var tenfive = par(AddFour, 10, 5);

// res = 10 + 5 + 1 + 2
var res = tenfive(1,2);

要咖喱,这样做:

// Example function
int AddFour(int a,int b,int c, int d)
{
    return a + b + c + d;
}

// Returns Func<int,Func<int,Func<int,Func<int,int>>>>
var f = curry(AddFour);

// res = 10 + 5 + 1 + 2
var res = f(10)(5)(1)(2);

以上是关于如何调用Func并将其传递给构造函数中具有较少参数的另一个Func?的主要内容,如果未能解决你的问题,请参考以下文章

如何将网格传递给“void my_func(void * args)”

将一个函数的所有参数传递给另一个函数

构造结构的结构并将其作为函数参数传递的有效方法

如何将双精度向量传递给构造函数,然后在子类中访问其数据(在 C++ 中)?

通过引用传递给构造函数

typescript:传递一个接受较少参数的函数 - 如何为传递的函数强制执行相同数量的参数