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

发布于 2024-08-30 11:19:21 字数 912 浏览 7 评论 0原文

我读过一些有关 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));

我想要实现的是“如果缓存为空则获取数据并添加到缓存”逻辑仅放置在一个位置。

我希望这是有道理的:)

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

i've read something about Func's and delegates and that they can help you to pass a method as a parameter.
Now i have a cachingservice, and it has this declaration:

public static void AddToCache<T>(T model, double millisecs, string cacheId) where T : class
public static T GetFromCache<T>(string cacheId) where T : class

So in a place where i want to cache some data, i check if it exists in the cache (with GetFromCache) and if not, get the data from somewhere, and the add it to the cache (with AddToCache)

Now i want to extend the AddToCache method with a parameter, which is the class+method to call to get the data
Then the declaration would be like this

public static void AddToCache<T>(T model, double millisecs, string cacheId, Func/Delegate methode) where T : class

Then this method could check wether the cache has data or not, and if not, get the data itself via the method it got provided.

Then in the calling code i could say:

AddToCache<Person>(p, 10000, "Person", new PersonService().GetPersonById(1));
AddToCache<Advert>(a, 100000, "Advert", new AdvertService().GetAdverts(3));

What i want to achieve is that the 'if cache is empty get data and add to cache' logic is placed on only one place.

I hope this makes sense :)

Oh, by the way, the question is: is this possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

明天过后 2024-09-06 11:19:21

您可能想要:

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

You probably want:

public static void AddToCache<T>(T model, double millisecs, string cacheId, 
   Func<T> methode) where T : class;

Usage:

AddToCache<Person>(p, 10000, "Person", 
       () => new PersonService().GetPersonById(1));
橙幽之幻 2024-09-06 11:19:21

像这样:

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

Like this:

public static void AddToCache<T>(T model, double millisecs, string cacheId, Func<T> getValueFunction ) where T : class
{
  // if miss:
  var person = getValueFunction.Invoke();
}

The call would look like:

AddToCache( p , 1, "Person", () => new PersonService().GetPersonById(1) );
神仙妹妹 2024-09-06 11:19:21

您可能想阅读此博客文章: 启动您的功能。它讨论了您正在使用相同方法解决的问题。

You might want to read this blog post: Get Your Func On . It discusses the problem you are solving with the same approach.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文