重载具有参数Func< T& gt;的方法 [英] Overloading a method with parameter Func<T>

查看:146
本文介绍了重载具有参数Func< T& gt;的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一些接受Func参数的重载方法.重载的方法应使用参数中定义的最通用的类​​型来调用该方法.以下是我的方法以及如何调用它们的快速示例:

I would like to create a few overloaded methods which accept a Func parameter. The overloaded methods should call the method with the most generic types defined in the parameter. Below is a quick example of my methods, and how I would like to call them:

public static TResult PerformCaching<TResult, T1>(Func<T1, TResult> func, T1 first, string cacheKey)
{
    return PerformCaching((t, _, _) => func, first, null, null, cacheKey);
}

public static TResult PerformCaching<TResult, T1, T2>(Func<T1, T2, TResult> func, T1 first, T2 second, string cacheKey)
{
    return PerformCaching((t, t2, _) => func, first, second, null, cacheKey);
}

public static TResult PerformCaching<TResult, T1, T2, T3>(Func<T1, T2, T3, TResult> func, T1 first, T2 second, T3 third, string cacheKey)
{
    Model data = Get(cacheKey);

    if(data == null)
    {
        Add(cacheKey);

        data = func.Invoke(first, second, third);

        Update(data);
    }

    return data;
}

是否有可能使它像这样工作?另一个问题是,函数到达最终方法时会发生什么情况.它会使用一个参数(调用第一个方法时)执行它,还是使用所有三个参数来调用它.

Would it be possible to get it working like this? Another question is what is happening to the func, when it reaches the final method. Would it execute it with one parameter (when the first method is called) or is it called with all three parameters.

推荐答案

不,这种方法行不通.您将尝试将Func<T1, TResult>传递给接受Func<T1, T2, T3, TResult>的方法-这根本行不通.我建议改成这样:

No, that approach wouldn't work. You'd be trying to pass a Func<T1, TResult> to a method accepting a Func<T1, T2, T3, TResult> - and that simply doesn't work. I would suggest changing to something like this:

public static TResult PerformCaching<TResult>(Func<TResult> func,
                                              string cacheKey)
{
    // Do real stuff in here
    // You may find ConcurrentDictionary helpful...
}

public static TResult PerformCaching<T1, TResult>
    (Func<T1, TResult> func, T1 first, string cacheKey)
{
    return PerformCaching(() => func(first), cacheKey);
}

public static TResult PerformCaching<T1, T2, TResult>
    (Func<T1, T2, TResult> func, T1 first, T2 second, string cacheKey)
{
    return PerformCaching(() => func(first, second), cacheKey);
}

public static TResult PerformCaching<T1, T2, T3, TResult>
    (Func<T1, T2, T3, TResult> func, T1 first, T2 second, T3 third,
     string cacheKey)
{
    return PerformCaching(() => func(first, second, third), cacheKey);
}

这篇关于重载具有参数Func&lt; T&amp; gt;的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆