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,是的,在classpublic class Cache:MemoryCache中定义,其中T:class
您对哪个部分有问题?您根本不知道如何创建Func
?你不知道如何将一个传递给一个方法?你发现有人用你不明白的方式做这件事?它可能最容易向我们展示的不仅仅是您试图调用的代码,更重要的是您试图调用它的代码,这样我们就可以为您提供建议。就目前情况而言,要准确地说出如何创建正确的Func
,而不知道您希望Func
做什么……在哪里定义了T
?在包含TryGetOrSet
的类上?这不是真正的代码,是吗?您没有声明T
(如在void TryGetOrSet(…)
,或者它在类型声明中?)并且您有一个void
方法返回一个bool
?尝试类似于()=>“我的字符串”
或()=>CallStringReturningMethod()
@YacoubMassad,是的,在classpublic 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
方法知道它应该为哪个键返回特定项会很有帮助。当然,我可能错了,因为我不知道代码的其余部分。