Можно объявить лямбда-функцию и немедленно вызвать ее:
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;
. Причина в следующем: я сгенерировал ссылку на веб-сервис SOAP svcutil
, который из-за вложенных элементов генерирует очень длинные имена классов, которые я хотел бы избежать при наборе. Так что вместо
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
часть) становится очень повторяющимся, если есть много полей. Объявление лямбды и немедленный вызов ее будет более изящным, чем писать меньше символов.
public T Exec<T>(Func<T> func) => return func();
и использовать ее так: « int x = Exec(() => { return 1; });
Мне кажется, это намного лучше, чем кастинг со всеми его паренами».
int output = ((Func<int>) (() => { return 1; }))();