English 中文(简体)
将参数列入《玛尔布达宣言》
原标题:Replacing parameters in a lambda expression

我的法典中有一部分是 run白 expressions语,然后我可以汇编和援引。

Something thing;

Expression<Action<Something>> expression = (c => c.DoWork());
Delegate del = expression.Compile();
del.DynamicInvoke(thing);

为了节省执行时间,我将这些汇编的代表储存在一个海滩上,一个<代码>Dictionary<String, Delegate>,钥匙是Mlambda的表述。

cache.Add("(Something)c => c.DoWork()", del);

对于同样的电话,该公司进行罚款。 然而,我认识到,我可以接受相等的拉姆布达斯,例如“d => d.DoWork()”,我实际上应该利用这位代表,我是没有。

我很想知道,是否有一个干净的方法(不是“利用强权”。 替换” 因此,

(c => c.DoWork()(d => d.DoWork())

改成<代码>(arg0 => arg0.DoWork(),使用与注射表达方式相类似的一些缩略语。 lam(Type, 姓名)

这是可能的吗? (净水量可包括C#4.0)

最佳回答

我使用了斜体,因为它是我最直觉的方法。 你可以人工改变参数表述的名称(它拥有“Name”财产,但只是读物),因此,你必须从碎片中找到新的表述。 我确实创建了一个“无名”参数(实际上,它在这个案例中获得了一个自动生成的名称,即“Param_0”,然后产生了几乎与旧的表示,但使用了新的参数。

public static void Main()
{
    String thing = "test";

    Expression<Action<String>> expression = c => c.ToUpper();
    Delegate del = expression.Compile();
    del.DynamicInvoke(thing);

    Dictionary<String, Delegate> cache = new Dictionary<String, Delegate>();
    cache.Add(GenerateKey(expression), del);

    Expression<Action<String>> expression1 = d => d.ToUpper();
    var test = cache.ContainsKey(GenerateKey(expression1));
    Console.WriteLine(test);

}

public static string GenerateKey(Expression<Action<String>> expr)
{
    ParameterExpression newParam = Expression.Parameter(expr.Parameters[0].Type);
    Expression newExprBody = Expression.Call(newParam, ((MethodCallExpression)expr.Body).Method);
    Expression<Action<String>> newExpr = Expression.Lambda<Action<String>>(newExprBody, newParam);
    return newExpr.ToString();
}
问题回答

更不用说案文。 汇编者将拉布达斯改写成更复杂的事情。 例如,它们可能会关闭变数(可包括其他代表)。 这意味着,两艘大炮可能完全相同,但采取完全不同的行动。

因此,你可能 l着你所汇编的表述,但你需要给他们一个比仅仅表达文本更重要的meaningful。 否则,任何理由替代都无助于你。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签