using System;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Collections.Generic;
namespace ConsoleApp1
{
public delegate void MyDelegate(string telemId, string className, string propName, object value);
public delegate void ReportCallback();
struct MyStruct {
string telemId;
MyDelegate reporter;
double a;
public double b;
double c;
public MyStruct(string telemIdVal, MyDelegate reportProc, double valA, double valB, double valC){
telemId = telemIdVal;
reporter = reportProc;
a = valA;
b = valB;
c = valC;
}
public void Report() {
reporter(this.telemId, this.GetType().ToString(), "a", a);
reporter(this.telemId, this.GetType().ToString(), "b", b);
reporter(this.telemId, this.GetType().ToString(), "c", c);
}
}
public class Program
{
public static void ReportTelemetry(string telemId, string className, string propName, object value) {
Console.WriteLine(String.Format("{0} - {1}.{2}: {3}", telemId, className, propName, value));
}
public static void Main() {
var altitude = new MyStruct("Altitude Controller", new MyDelegate(ReportTelemetry), 15, 2, Math.PI);
var speed = new MyStruct("Speed Controller", new MyDelegate(ReportTelemetry), 22, 15, Math.PI);
var d = new Dictionary<object, ReportCallback>();
d.Add(altitude, new ReportCallback(altitude.Report));
d.Add(speed, speed.Report);
foreach (var kvp in d){
kvp.Value();
}
altitude.b = 123123.12;
foreach (var kvp in d){
kvp.Value();
}
Console.WriteLine(altitude.b.ToString());
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7CnVzaW5nIFN5c3RlbS5MaW5xOwp1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CnVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwoKbmFtZXNwYWNlIENvbnNvbGVBcHAxCnsKCXB1YmxpYyBkZWxlZ2F0ZSB2b2lkIE15RGVsZWdhdGUoc3RyaW5nIHRlbGVtSWQsIHN0cmluZyBjbGFzc05hbWUsIHN0cmluZyBwcm9wTmFtZSwgb2JqZWN0IHZhbHVlKTsKCXB1YmxpYyBkZWxlZ2F0ZSB2b2lkIFJlcG9ydENhbGxiYWNrKCk7CgkKCXN0cnVjdCBNeVN0cnVjdCB7CgkJc3RyaW5nIHRlbGVtSWQ7CgkJTXlEZWxlZ2F0ZSByZXBvcnRlcjsKCQlkb3VibGUgYTsKCQlwdWJsaWMgZG91YmxlIGI7CgkJZG91YmxlIGM7CgkJcHVibGljIE15U3RydWN0KHN0cmluZyB0ZWxlbUlkVmFsLCBNeURlbGVnYXRlIHJlcG9ydFByb2MsIGRvdWJsZSB2YWxBLCBkb3VibGUgdmFsQiwgZG91YmxlIHZhbEMpewoJCQl0ZWxlbUlkID0gdGVsZW1JZFZhbDsKCQkJcmVwb3J0ZXIgPSByZXBvcnRQcm9jOwoJCQlhID0gdmFsQTsKCQkJYiA9IHZhbEI7CgkJCWMgPSB2YWxDOwoJCX0KCQlwdWJsaWMgdm9pZCBSZXBvcnQoKSB7CgkJCXJlcG9ydGVyKHRoaXMudGVsZW1JZCwgdGhpcy5HZXRUeXBlKCkuVG9TdHJpbmcoKSwgImEiLCBhKTsKCQkJcmVwb3J0ZXIodGhpcy50ZWxlbUlkLCB0aGlzLkdldFR5cGUoKS5Ub1N0cmluZygpLCAiYiIsIGIpOwoJCQlyZXBvcnRlcih0aGlzLnRlbGVtSWQsIHRoaXMuR2V0VHlwZSgpLlRvU3RyaW5nKCksICJjIiwgYyk7CgkJfQoKCX0KCQogIHB1YmxpYyBjbGFzcyBQcm9ncmFtCiAgewogIAlwdWJsaWMgc3RhdGljICB2b2lkIFJlcG9ydFRlbGVtZXRyeShzdHJpbmcgdGVsZW1JZCwgc3RyaW5nIGNsYXNzTmFtZSwgc3RyaW5nIHByb3BOYW1lLCBvYmplY3QgdmFsdWUpIHsKICAJCUNvbnNvbGUuV3JpdGVMaW5lKFN0cmluZy5Gb3JtYXQoInswfSAtIHsxfS57Mn06IHszfSIsIHRlbGVtSWQsIGNsYXNzTmFtZSwgcHJvcE5hbWUsIHZhbHVlKSk7CiAgCX0KCQoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKSB7CgkJICB2YXIgYWx0aXR1ZGUgPSBuZXcgTXlTdHJ1Y3QoIkFsdGl0dWRlIENvbnRyb2xsZXIiLCBuZXcgTXlEZWxlZ2F0ZShSZXBvcnRUZWxlbWV0cnkpLCAxNSwgMiwgTWF0aC5QSSk7CgkJICB2YXIgc3BlZWQgID0gbmV3IE15U3RydWN0KCJTcGVlZCBDb250cm9sbGVyIiwgbmV3IE15RGVsZWdhdGUoUmVwb3J0VGVsZW1ldHJ5KSwgMjIsIDE1LCBNYXRoLlBJKTsKCgkJICB2YXIgZCA9IG5ldyBEaWN0aW9uYXJ5PG9iamVjdCwgUmVwb3J0Q2FsbGJhY2s+KCk7CgkJICBkLkFkZChhbHRpdHVkZSwgbmV3IFJlcG9ydENhbGxiYWNrKGFsdGl0dWRlLlJlcG9ydCkpOwoJCSAgZC5BZGQoc3BlZWQsIHNwZWVkLlJlcG9ydCk7CgoJCSAgZm9yZWFjaCAodmFyIGt2cCBpbiBkKXsKCQkgIAlrdnAuVmFsdWUoKTsKCQkgIH0KCQkgIAoJCSAgYWx0aXR1ZGUuYiA9IDEyMzEyMy4xMjsKCgkJICBmb3JlYWNoICh2YXIga3ZwIGluIGQpewoJCSAgCWt2cC5WYWx1ZSgpOwoJCSAgfQoJCSAgCgkJICBDb25zb2xlLldyaXRlTGluZShhbHRpdHVkZS5iLlRvU3RyaW5nKCkpOwoJfQogICAgCiAgfQp9