我有一个帮助方法,它获取由lambda定义的属性的名称,其工作方式如下:
ExpressionUtil.GetName((Thing t) => t.Property); // returns "Property"
我想将其转换为扩展方法,因此语法将采用以下形式:
((Thing t) => t.Property).GetName(); // wont compile : operator '.' cannot be applies to operand of type 'lambda expression'
但是我似乎无法这样做,因为((Thing t) => t.Property)
是一个lambda(不是表达式或Func)。有没有办法编写一个直接应用于lambda的扩展方法?如果不是为什么这是一件坏事?
答案 0 :(得分:3)
你不能这样做,因为lambda表达式本身没有类型;其类型由上下文确定(例如,如果将其分配给委托变量或将其作为参数传递给方法)。
由于((Thing t) => t.Property)
没有类型,因此您无法在其上调用扩展方法,因为编译器不知道哪些扩展方法是有效的候选者。
但是,您可以声明一个变量并在其上调用扩展方法:
Func<Thing, OtherThing> func = t => t.Property;
string name = func.GetName();
答案 1 :(得分:1)
您可以以具有引入实例化的低成本在Action上创建扩展方法。 我有时使用它,代码是可读的。 这段代码存在的原因不那么优雅,烂了NAS: - [
new Action(() =>
{
if (File.Exists(newFullPath))
File.Delete(newFullPath);
File.Move(oldFullPath, newFullPath);
})
.Try(attemps: 2, exceptionValidator: (exception, attempt, attempts) =>
{
var throwIt = (attempt == attempts);
if (!throwIt)
Thread.Sleep(500);
// .. tracing ./. throw
return (throwIt);
});
以防万一......即使发帖不年轻。