Изменение сеттера через рефлексию
Как сделать аналог такого свойства через рефлексию?
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!