using System;
public class Test
{
private static DeviredExample _devired;
public static void Main()
{
_devired = new DeviredExample();
_devired.CallMethod += (sender, message) =>
{
Console.WriteLine(message);
};
_devired.SayHello();
}
}
public class Example
{
public void SayHello() => Console.WriteLine("Hello");
}
public class DeviredExample : Example
{
public delegate void MethodCall(object sender, string message);
public event MethodCall CallMethod;
protected virtual void OnCallMethod(string message, Action callback)
{
callback?.Invoke();
CallMethod?.Invoke(this, message);
}
public new void SayHello()
{
OnCallMethod("Say hello called", () => base.SayHello());
}
}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIFRlc3QKewoJcHJpdmF0ZSBzdGF0aWMgRGV2aXJlZEV4YW1wbGUgX2RldmlyZWQ7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkJX2RldmlyZWQgPSBuZXcgRGV2aXJlZEV4YW1wbGUoKTsKCQlfZGV2aXJlZC5DYWxsTWV0aG9kICs9IChzZW5kZXIsIG1lc3NhZ2UpID0+CiAgICAgICAgewoJCQlDb25zb2xlLldyaXRlTGluZShtZXNzYWdlKTsKICAgICAgICB9OwogICAgICAgIF9kZXZpcmVkLlNheUhlbGxvKCk7Cgl9Cn0KCiAgICBwdWJsaWMgY2xhc3MgRXhhbXBsZQogICAgewogICAgICAgIHB1YmxpYyB2b2lkIFNheUhlbGxvKCkgPT4gQ29uc29sZS5Xcml0ZUxpbmUoIkhlbGxvIik7CiAgICB9CgogICAgcHVibGljIGNsYXNzIERldmlyZWRFeGFtcGxlIDogRXhhbXBsZQogICAgewogICAgICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIE1ldGhvZENhbGwob2JqZWN0IHNlbmRlciwgc3RyaW5nIG1lc3NhZ2UpOwoKICAgICAgICBwdWJsaWMgZXZlbnQgTWV0aG9kQ2FsbCBDYWxsTWV0aG9kOwogICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgT25DYWxsTWV0aG9kKHN0cmluZyBtZXNzYWdlLCBBY3Rpb24gY2FsbGJhY2spCiAgICAgICAgewogICAgICAgICAgICBjYWxsYmFjaz8uSW52b2tlKCk7CiAgICAgICAgICAgIENhbGxNZXRob2Q/Lkludm9rZSh0aGlzLCBtZXNzYWdlKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBuZXcgdm9pZCBTYXlIZWxsbygpCiAgICAgICAgewogICAgICAgICAgICBPbkNhbGxNZXRob2QoIlNheSBoZWxsbyBjYWxsZWQiLCAoKSA9PiBiYXNlLlNheUhlbGxvKCkpOwogICAgICAgIH0KICAgIH0=