“所有方法”的C#委托或Func?

问题描述:

我已阅读了关于Func和代表的一些信息,他们可以帮助您将方法作为参数传递。 现在我有一个cachingservice,它有这样的声明:“所有方法”的C#委托或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)); 

什么我想要实现的是,“如果缓存为空获取数据并添加缓存”逻辑放在只有一个地方。

我希望这是有道理的:)

哦,顺便说一下,问题是:这可能吗?

像这样:

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)); 
+0

是的,作品!非常感谢.... – Michel 2010-04-23 11:23:57

你可能想:

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

问题标题的答案是'Delegate'类表示任何函数或委托,但是,这可能是他们想要的。 +1 – 2010-04-23 08:04:35

您可能想阅读以下博文:Get Your Func On。它用相同的方法讨论你正在解决的问题。