可以声明一个Lambda函数并立即调用它:
Func<int, int> lambda = (input) => { return 1; };
int output = lambda(0);
我想知道是否可能在一行代码中完成,例如:
int output = (input) => { return 1; }(0);
这会导致编译错误 "需要方法名"。强制转换为 Func<int, int>
也不起作用:
int output = (Func<int, int>)((input) => { return 1; })(0);
出现了相同的错误,而且由于下面提到的原因,我希望避免显式指定输入参数类型(第一个int
)。
你可能想知道为什么我要这样做,而不是直接嵌入代码,例如:int output = 1;
。原因如下:我使用 svcutil
生成了一个SOAP webservice的参考,由于嵌套元素的存在,它生成了非常长的类名,我希望避免手动敲入这些名称。所以,我想通过重载方法来实现更短的调用方式。
var o = await client.GetOrderAsync(request);
return new Order {
OrderDate = o.OrderDate,
...
Shipments = o.Shipment_Order == null ? new Shipment[0]
o.Shipment_Order.Select(sh => new Shipment {
ShipmentID = sh.ShipmentID,
...
Address = CreateAddress(sh.ReceiverAddress_Shipment);
}).ToArray()
};
另外还有一个单独的方法CreateAddress(GetOrderResultOrderShipment_OrderShipmentShipment_Address address)
(真实名称甚至更长,而且我对表单的控制非常有限),我想写成:
var o = await client.GetOrderAsync(request);
return new Order {
OrderDate = o.OrderDate,
...
Shipments = o.Shipment_Order == null ? new Shipment[0]
o.Shipment_Order.Select(sh => new Shipment {
ShipmentID = sh.ShipmentID,
...
Address = sh.ReceiverAddress_Shipment == null ? null : () => {
var a = sh.ReceiverAddress_Shipment.Address;
return new Address {
Street = a.Street
...
};
}()
}).ToArray()
};
我知道我可以写。Address = sh.ReceiverAddress_Shipment == null ? null : new Address {
Street = sh.ReceiverAddress_Shipment.Address.Street,
...
}
但是,如果有很多字段,即使是那个(sh.ReceiverAddress_Shipment.Address
部分),也会变得非常重复。声明一个lambda并立即调用它会更加简洁。
int output = ((Func<int>) (() => { return 1; }))();
- Dmitry Bychenkopublic T Exec<T>(Func<T> func) => return func();
,然后像这样使用它:int x = Exec(() => { return 1; });
对我来说,这比所有括号的强制转换更易读。 - germipublic U Exec<T, U>(Func<T, U> func, T input) => func(input);
。你可能想将其扩展为一个答案。 - Glorfindel