C# 如何传递函数<;T>;方法参数

C# 如何传递函数<;T>;方法参数,c#,C#,我找到了获取/设置缓存项的代码,但我不知道如何调用此方法,例如,如何将适当的Func getData传递给此方法 public class Cache<T> : MemoryCache where T : class { public void Set(string cacheKey, T cacheItem, CacheItemPolicy policy = null) { //... }

我找到了获取/设置缓存项的代码,但我不知道如何调用此方法,例如,如何将适当的
Func 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;
        }
    }

您的示例缺少
T
的声明,但是您已经在类中对其进行了注释

public class Cache<T>
{
    public void TryGetOrSet( string cacheKey, Func<T> getData, out T returnData, CacheItemPolicy policy = null )
    {
       ...
    }
}
然后,任何不接受参数并返回字符串的方法都可以作为该参数传递

string value = null;
myCache.TryGetOrSet("some_key", () => "foo", out value);
此外,如果您有一个方法可以在某处获取数据,那么可以传递对该方法的引用

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

针对您的更新:

第一个问题:通过使用TryGetOrSet方法,我如何将项(键:userName变量,值:lastName变量)添加到缓存中?当然,当缓存中不存在此项时

var cache = new Cache<string>("UserInfo");
var userName = "test";
var lastName = "test2";
TryGetOrSet(userName, ???, out var _) // <- what should I pass to Func<T>?
var cache=new cache(“UserInfo”);
var userName=“test”;
var lastName=“test2”;
字符串结果=null;
TryGetOrSet(用户名,()=>lastName,输出结果);

您的示例缺少
T
的声明-但是您已经在类中对其进行了注释

public class Cache<T>
{
    public void TryGetOrSet( string cacheKey, Func<T> getData, out T returnData, CacheItemPolicy policy = null )
    {
       ...
    }
}
然后,任何不接受参数并返回字符串的方法都可以作为该参数传递

string value = null;
myCache.TryGetOrSet("some_key", () => "foo", out value);
此外,如果您有一个方法可以在某处获取数据,那么可以传递对该方法的引用

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

针对您的更新:

第一个问题:通过使用TryGetOrSet方法,我如何将项(键:userName变量,值:lastName变量)添加到缓存中?当然,当缓存中不存在此项时

var cache = new Cache<string>("UserInfo");
var userName = "test";
var lastName = "test2";
TryGetOrSet(userName, ???, out var _) // <- what should I pass to Func<T>?
var cache=new cache(“UserInfo”);
var userName=“test”;
var lastName=“test2”;
字符串结果=null;
TryGetOrSet(用户名,()=>lastName,输出结果);

哪里定义了
T
?在包含
TryGetOrSet
的类上?这不是真正的代码,是吗?您没有声明
T
(如在
void TryGetOrSet(…)
,或者它在类型声明中?)并且您有一个
void
方法返回一个
bool
?尝试类似于
()=>“我的字符串”
()=>CallStringReturningMethod()
@YacoubMassad,是的,在class
public class Cache:MemoryCache中定义,其中T:class
您对哪个部分有问题?您根本不知道如何创建
Func
?你不知道如何将一个传递给一个方法?你发现有人用你不明白的方式做这件事?它可能最容易向我们展示的不仅仅是您试图调用的代码,更重要的是您试图调用它的代码,这样我们就可以为您提供建议。就目前情况而言,要准确地说出如何创建正确的
Func
,而不知道您希望
Func
做什么……在哪里定义了
T
?在包含
TryGetOrSet
的类上?这不是真正的代码,是吗?您没有声明
T
(如在
void TryGetOrSet(…)
,或者它在类型声明中?)并且您有一个
void
方法返回一个
bool
?尝试类似于
()=>“我的字符串”
()=>CallStringReturningMethod()
@YacoubMassad,是的,在class
public class Cache:MemoryCache中定义,其中T:class
您对哪个部分有问题?您根本不知道如何创建
Func
?你不知道如何将一个传递给一个方法?你发现有人用你不明白的方式做这件事?它可能最容易向我们展示的不仅仅是您试图调用的代码,更重要的是您试图调用它的代码,这样我们就可以为您提供建议。就目前而言,在不知道
Func
要做什么的情况下准确地说出如何创建正确的
Func
将是相当棘手的……我认为将
传递给数据访问方法也会很有用:
myCache.TryGetOrSet(“some_key”,()=>repo.MyDataAccessMethod(“some_key”),out data)但这取决于OP实际要做什么,这还没有解释。@RenéVogt这是一个相当标准的缓存包装器。我不知道你为什么要将缓存键传递给DAL——这对我来说毫无意义。因为(在我看来代码)它试图为一个特定的键找到一个特定的对象,如果它还没有在缓存中,它会调用
getData
,从另一个源准确地获取该项并将其添加到缓存中。因此我猜想
getData
方法知道它应该为哪个
键返回特定项会很有帮助。当然,我可能错了,因为我不知道代码的其余部分。我认为将
传递给数据访问方法也是有用的:
myCache.TryGetOrSet(“some_key”,()=>repo.MyDataAccessMethod(“some_key”),out data)但这取决于OP实际要做什么,这还没有解释。@RenéVogt这是一个相当标准的缓存包装器。我不知道你为什么要将缓存键传递给DAL——这对我来说毫无意义。因为(在我看来代码)它试图为一个特定的键找到一个特定的对象,如果它还没有在缓存中,它会调用
getData
,从另一个源准确地获取该项并将其添加到缓存中。因此我猜想
getData
方法知道它应该为哪个
键返回特定项会很有帮助。当然,我可能错了,因为我不知道代码的其余部分。