Вы не можете просто привести замыкание к его конкретному типу, так как имя заранее не известно и (вполне преднамеренно) является недопустимым именем в C #.
Вы можете попытаться получить доступ к его полям либо с помощьюdynamic
:
dynamic target = aa.Target;
int value = target.i;
или с отражением:
var closureType = aa.Target.GetType();
var field = closureType.GetField("i");
var value = (int)field.GetValue(aa.Target);
Однако я настоятельно рекомендую не полагаться на это, поскольку нет никаких гарантий относительно способа, которым компилятор решит сгенерироватьзакрытие и назовите переменные.Различные версии компилятора или, казалось бы, несвязанные модификации лямбды могут привести к очень разным результатам, что приведет к поломке этого кода.
Если у вас есть контроль над кодом, который генерирует делегат, я бы рекомендовал определить свой собственный класс с публичнодоступное поле / свойство вместо того, чтобы использовать лямбду и пытаться возиться с замыканием, сгенерированным компилятором.
public class Foo
{
public int i;
public string Bar(string s) => s.ToUpper() + (i++);
}
var foo = new Foo();
Func<string, string> aa = foo.Bar;