2011-11-21 155 views
4

我有一个非常不必要的困境。我懒洋洋地寻找一个将lamda表达式转换为字符串的函数。它困扰我,我每次都在输入这个缓存键,但我并不想花时间来创建它。C#将Lambda表达式函数转换为描述性字符串

我想使用它的缓存功能,我创建:

在哪里,如果我想获得一个人的名称,而不每次调用该函数。

public static string GetPersonName(int id) 
{ 
    return Repository.PersonProvider.Cached(x => x.GetById(id)).Name; 
} 

的GetExpressionDescription将返回“PersonProvider.GetById(INT 10)”

我想这是可能的,但我不知道是否有人已经建立了这个或已在哪儿见过它。

public static R Cached<T, R>(this T obj, Expression<Func<T, R>> function, double hours = 24) 
{ 
    var expressionDescription = GetExpressionDescription(function); 
    return Cached(function, expressionDescription, hours); 
} 

public static R Cached<T, R>(this T obj, Expression<Func<T, R>> function, string cacheName, double hours = 24) 
{ 
    var context = HttpContext.Current; 
    if (context == null) 
     return function.Compile().Invoke(obj); 

    R results = default(R); 
    try { results = (R)context.Cache[cacheName]; } 
    catch { } 
    if (results == null) 
    { 
     results = function.Compile().Invoke(obj); 
     if (results != null) 
     { 
      context.Cache.Add(cacheName, results, null, DateTime.Now.AddHours(hours), 
           Cache.NoSlidingExpiration, 
           CacheItemPriority.Default, null); 
     } 
    } 
    return results; 
} 
+2

可能重复(http://stackoverflow.com/questions/4793981/converting-expressiont-bool-to-string) –

+1

不能你只需要调用的ToString( )? –

回答

5

可以简单地得到的Expression<>字符串表示与.ToString()

using System; 
using System.Linq.Expressions; 

public class Program 
{ 
    public static void Main() 
    { 
     Test(s => s.StartsWith("A")); 
    } 

    static void Test(Expression<Func<string,bool>> expr) 
    { 
     Console.WriteLine(expr.ToString()); 
     Console.ReadKey(); 
    } 
} 

打印:

S => s.StartsWith( “A”)

参见:https://dotnetfiddle.net/CJwAE5

但它当然不会让你的调用者和变量的值,只是表达式本身。

+0

同意 - 对我来说,我发现如果.ToString()不足以满足我需要,我可能会做错了。 – moarboilerplate

1

也许你应该试试DynamicExpresso。我使用该库来开发轻量级业务规则引擎。 [转换表达 为String]的

https://github.com/davideicardi/DynamicExpresso

+0

我们为什么不试试“DynamicExpresso”?减号是否来自专家,他有很多事情要教给别人?任何贡献都应该受到欢迎。 –

相关问题