m.P == p-6ren">
gpt4 book ai didi

c# - 将 LambdaExpression 转换为字符串,包括值

转载 作者:太空狗 更新时间:2023-10-30 00:32:47 26 4
gpt4 key购买 nike

我有一个将 LambdaExpression 转换为字符串的方法。我将这些字符串用作缓存的键。

string p = "x";
var a = LambdaToString<MyType>(m => m.P == p);

与此不同:

string p = "y";
var a = LambdaToString<MyType>(m => m.P == p);

但是,无论 p 的值如何,我的 LambdaToString 方法的当前状态都会产生相同的输出。即:

(MyType.P == value(ConsoleApplication1.Program+<>c__DisplayClass0).p)

我希望我的 LambdaToString 函数做的是将表达式的“value(class).p”部分解析为“x”或“y”的实际文字字符串,视情况而定。

这是我的 LambdaToString 方法的当前状态。我不确定我需要做什么来修改它以产生我想要的输出:

    public static string LambdaToString<T>(Expression<Func<T, bool>> expression)
{
string body = expression.Body.ToString();

foreach (var parm in expression.Parameters)
{
var parmName = parm.Name;
var parmTypeName = parm.Type.Name;
body = body.Replace(parmName + ".", parmTypeName + ".");
}

return body;
}

最佳答案

I use these strings as keys for a cache.

它在很多情况下都是不正确的,即使它在您的项目中也能正常工作。使用 Expression.ToString() 作为键可以很容易地被击败:

//counter-example 1
Expression<Func<string, bool>> exp1 = s => s == "a";
Expression<Func<string, bool>> exp2 = ss => ss == "a";
//the two will be considered different in your cache solution
//but they are essentially the same, well that's not the worst, see next

//counter-example 2
Expression<Func<int, bool>> exp3 = i => i > 10;
Expression<Func<long, bool>> exp4 = i => i > 10;
//the two will be considered the same in your cache solution
//of course they are different, probably hences runtime exceptions

以上根本不是答案。如果你不关心这些,我们继续基于“使用字符串作为键”。

你想缓存表达式,但要识别那些看起来相同的表达式,其中包含常量。那为什么不用表达式+常量来构建 key 呢?在您的示例代码中,键将是:

"m => m.P == p @@SPECIAL_SEPERATOR@@ x"
"m => m.P == p @@SPECIAL_SEPERATOR@@ y"

是的,如果一个常量包含像“@@SPECIAL_SEPERATOR@@”这样的值,一切都会崩溃。这从一开始就不是一个严格的解决方案,因为您选择字符串作为缓存键。

如果您决定选择另一种缓存方法,请检查 this .

关于c# - 将 LambdaExpression 转换为字符串,包括值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15478711/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com