簡體   English   中英

C#將Lambda表達式函數轉換為描述性字符串

[英]C# Converting Lambda Expression Function to Descriptive String

我有一個非常不必要的困境。 我懶洋洋地尋找一個將lamda表達式轉換為字符串的函數。 我每次都在輸入這個緩存密鑰讓我感到困擾,但我真的不想花時間去創建它。

我想用它來創建我創建的緩存函數:

如果我想在沒有每次調用函數的情況下為某個人獲取名稱的話。

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

您只需使用.ToString()獲取Expression<>的字符串表示形式:

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

但是當然它不會讓你調用者和變量的值,只是表達式本身。

也許你應該嘗試DynamicExpresso。 我使用該庫開發了一個輕量級的業務規則引擎。

https://github.com/davideicardi/DynamicExpresso

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM