Изменение сеттера через рефлексию

Как сделать аналог такого свойства через рефлексию?

private string _myProperty1;

public string MyProperty1 
{
    get => _myProperty1;
    set
    {
        _myProperty1 = value;
        Test();
    }
}

Текущий код падает с ошибкой: System.ArgumentException: 'method arguments are incompatible'

class MyClass
{
    delegate void TestDelegate(dynamic value);
        
    public MyClass()
    {
        TestDelegate testDelegate = Test;
        foreach (var prop in this.GetType().GetProperties())
        {
            var setter = prop.GetSetMethod();
            setter.CreateDelegate(typeof(TestDelegate), testDelegate);
        }
    }
        
    private void Test(dynamic value = null)
    {
        Console.WriteLine("Works!");
    }
        
    public string MyProperty1 { get; set; }
}

Ответы (1 шт):

Автор решения: return

Используйте старый как мир паттерн GoF: Proxy:

Библиотечный класс (read-only)

public sealed class SomeClass
{
    public string SomeProperty { get; set; }
}

Proxy-класс

public sealed class SomeClassProxy
{
    SomeClass inst;

    public string SomeProperty
    {
        get => inst.SomeProperty;
        set
        {
            // checking skipped

            inst.SomeProperty = value;
            
            Test();
        }
    }

    public SomeClassProxy()
    {
        inst = new SomeClass();
    }

    void Test()
    {
        Console.WriteLine("Test!");
    }
}

Использование

void Run()
{
    var proxy = new SomeClassProxy { SomeProperty = "hello" };

    Console.WriteLine("Changing...");

    proxy.SomeProperty = "bye";
}

Вывод

Test!
Changing...
Test!
→ Ссылка