C# 带表达式的缓存包装器

C# 带表达式的缓存包装器,c#,asp.net,caching,C#,Asp.net,Caching,我不知道这是否可能 我想要一个类来封装我站点的所有缓存。我正在考虑这样做的最佳方法,以避免与密钥冲突 我的第一个想法是这样的: public static TResult Cachear<TResult>(this Cache cache, Expression<Func<TResult>> funcao) { string chave = funcao.ToString(); if (!(cache[chav

我不知道这是否可能

我想要一个类来封装我站点的所有缓存。我正在考虑这样做的最佳方法,以避免与密钥冲突

我的第一个想法是这样的:

    public static TResult Cachear<TResult>(this Cache cache, Expression<Func<TResult>> funcao)
    {
        string chave = funcao.ToString();

        if (!(cache[chave] is TResult))
        {
            cache[chave] = funcao.Compile()();
        }

        return (TResult)cache[chave];
    }
publicstatictresult缓存(此缓存,表达式funcao)
{
字符串chave=funcao.ToString();
如果(!(缓存[chave]是TResult))
{
cache[chave]=funcao.Compile();
}
返回(TResult)缓存[chave];
}
最好的办法是什么?tyexpression.ToString()相当昂贵

另一个问题是
Expression
始终是新创建的对象,因此它们永远不会具有相同的引用,因此将其用作键是有问题的

最后一个问题(目前还不影响您)是考虑所有可能的参数组合

我唯一能建议的就是忘记
Expression
,直接使用
Func

Expression.ToString()
相当昂贵

另一个问题是
Expression
始终是新创建的对象,因此它们永远不会具有相同的引用,因此将其用作键是有问题的

最后一个问题(目前还不影响您)是考虑所有可能的参数组合


我唯一能建议的就是忘记
表达式
,直接使用
Func

我做了一个这样的类。在codeplex:

我做了一个这样做的类。在codeplex:

表达式关于Func的优点正是关于参数的。ToString返回整个表达式。我不明白钥匙的问题。这是一根绳子。PS:Ops,expression-return-parameters-names,dont-values=/@Fujiy:ToString方法与非常快速的查找,甚至可能是表达式的编译相比是昂贵的。主要问题是如何基于参数和方法获得唯一的字符串name@Fujiy:有几种方法可以解决这个问题。例如,创建一个封装对象来计算所有参数的异或散列(以及相等)。但不确定如何处理方法名(我以前做过,但现在没有代码了)。搜索Memomization以获取提示(我认为在被动扩展中有一些东西)。Func的表达式优势正是关于参数的。ToString返回整个表达式。我不明白钥匙的问题。这是一根绳子。PS:Ops,expression-return-parameters-names,dont-values=/@Fujiy:ToString方法与非常快速的查找,甚至可能是表达式的编译相比是昂贵的。主要问题是如何基于参数和方法获得唯一的字符串name@Fujiy:有几种方法可以解决这个问题。例如,创建一个封装对象来计算所有参数的异或散列(以及相等)。但不确定如何处理方法名(我以前做过,但现在没有代码了)。搜索Memomization以获取提示(我认为在被动扩展中有一些东西)。