В C # ключевое слово this
связано с лексической областью, поэтому оно всегда будет ссылаться на экземпляр класса, которому назначен Action
.
Чтобы преодолеть это, вы можете просто передать экземпляр Test
в качестве параметра Action
следующим образом:
public class Test
{
public int P { get; set; }
public Action<Test> A;
public void Run()
{
this.A(this);
}
}
Использование:
var t = new Test();
t.A = test =>
{
// you can now access `Test` properties
var p = test.P;
};
t.Run();
В качестве альтернативы, вы можете «захватить» вашу текущую ссылку на t
, используя замыкание, но для этого обычно требуется, чтобы компилятор генерировал тип для представления этого делегата (что может иметь проблемы с производительностью, в зависимости от вашего сценария):
var t = new Test();
t.A = () => {
// access Test properties using `t`
var p = t.P;
};
t.Run();