我已经阅读了有关Func和委托的内容,他们可以帮助您将方法作为参数传递。 现在我有一个缓存服务,它有这个声明:
public static void AddToCache<T>(T model, double millisecs, string cacheId) where T : class
public static T GetFromCache<T>(string cacheId) where T : class
所以在我想要缓存一些数据的地方,我检查它是否存在于缓存中(使用GetFromCache),如果没有,从某处获取数据,并将其添加到缓存中(使用AddToCache)
现在我想用一个参数扩展AddToCache方法,这是要调用以获取数据的类+方法 然后声明就像这样
public static void AddToCache<T>(T model, double millisecs, string cacheId, Func/Delegate methode) where T : class
然后这个方法可以检查缓存是否有数据,如果没有,则通过它提供的方法获取数据。
然后在调用代码中我可以说:
AddToCache<Person>(p, 10000, "Person", new PersonService().GetPersonById(1));
AddToCache<Advert>(a, 100000, "Advert", new AdvertService().GetAdverts(3));
我想要实现的是'if cache is empty get data and add to cache'逻辑只放在一个地方。
我希望这是有道理的:)
哦,顺便说一下,问题是:这可能吗?
答案 0 :(得分:7)
你可能想要:
public static void AddToCache<T>(T model, double millisecs, string cacheId,
Func<T> methode) where T : class;
用法:
AddToCache<Person>(p, 10000, "Person",
() => new PersonService().GetPersonById(1));
答案 1 :(得分:3)
像这样:
public static void AddToCache<T>(T model, double millisecs, string cacheId, Func<T> getValueFunction ) where T : class
{
// if miss:
var person = getValueFunction.Invoke();
}
电话会是:
AddToCache( p , 1, "Person", () => new PersonService().GetPersonById(1) );
答案 2 :(得分:1)
您可能需要阅读此博文:Get Your Func On 。它用相同的方法讨论了你要解决的问题。