如何将Func <t>传递给方法参数

时间:2017-06-27 08:59:31

标签: c#

我找到了Get / Set缓存项的代码,但我不知道如何调用此方法,例如。如何将Func<T> getData传递给此方法?

public class Cache<T> : MemoryCache where T : class
    {
        public void Set(string cacheKey, T cacheItem, CacheItemPolicy policy = null)
        {
            //...
        }

        public bool TryGet(string cacheKey, out T returnItem)
        {
             //...
        }
        public bool TryGetOrSet( string cacheKey, Func<T> getData, out T returnData, CacheItemPolicy policy = null )
        {
            if( TryGet( cacheKey, out returnData ) )
                return true;

            lock( WriteLock )
            {
                if( TryGet( cacheKey, out returnData ) )
                    return true;

                returnData = getData();
                Set( cacheKey, returnData, policy );
            }

            return false;
        }
    }

例如,假设缓存类型为string

第一个问题:通过使用方法TryGetOrSet,如何将项目(key:userName变量,value:lastName变量)添加到缓存中?当然这个项目在缓存中不存在

var cache = new Cache<string>("UserInfo");
var userName = "test";
var lastName = "test2";
TryGetOrSet(userName, ???, out var _) // <- what should I pass to Func<T>?

1 个答案:

答案 0 :(得分:5)

您的示例缺少T的声明 - 但您已在课堂上对其进行了评论

public class Cache<T>
{
    public void TryGetOrSet( string cacheKey, Func<T> getData, out T returnData, CacheItemPolicy policy = null )
    {
       ...
    }
}

在这种情况下,您可以传递getData任何与预期签名匹配的方法(匿名或其他方式)。所以说你有一个实例

var myCache = new Cache<string>();

然后,任何不带参数并返回字符串的方法都可以作为该参数传递。

string value = null;
myCache.TryGetOrSet("some_key", () => "foo", out value);

此外,如果你有一个方法可以在某个地方获取你的数据,那么可以传递对它的引用

// somewhere eg "MyRepository"
public IEnumerable<MyObject> MyDataAccessMethod() { return Enumerable.Empty<MyObject>(); }

var myCache = new Cache<IEnumerable<MyObject>>();
var repo = new MyRepository();
IEnumerable<MyObject> data = null;
myCache.TryGetOrSet("some_key", repo.MyDataAccessMethod, out data);

作为旁注,您已声明方法返回void但您返回布尔值 - 这是有道理的,因为TryXXX方法返回布尔值表示成功。

public bool TryGetOrSet( string cacheKey, Func<T> getData, out T returnData, CacheItemPolicy policy = null )
{
   ...
}

响应您的更新:

  

第一个问题:通过使用方法TryGetOrSet如何将项目(key:userName变量,value:lastName变量)添加到缓存中?当然,当这个项目不存在于缓存

中时
var cache = new Cache<string>("UserInfo");
var userName = "test";
var lastName = "test2";
string result = null;
TryGetOrSet(userName, () => lastName, out result) ;