public void Send(BlDataStruct eventReport)
    {
        var eventReportAttr = GetEventreportAttribute(eventReport);

        if (eventReportAttr == null)
        {
            throw new Exception("Event report must have EventReportAttribute");
        }

        var eventReportData = new EventReportEncoder(eventReportAttr.EventReportType, eventReport);

        eventReportData.SenderId   = eventReport.SenderId;
        eventReportData.ReceiverId = eventReport.ReceiverId;

        foreach (var field in eventReport.GetType().GetFields())
        {
            if (field.Name == "SenderId" || field.Name == "ReceiverId")
            {
                continue;
            }
            var value = field.GetValue(eventReport);
            eventReportData.Write(value, field);
        }

        NetSimAgent.Instance.SendEventReportInteraction(ExerciseConnection.ExerciseConnectionPtr, eventReportData.EventReportPduPtr);
    }
    private void EventReportReceived(uint eventType, IntPtr pduPtr)
    {
        if (subscribersByEventType.ContainsKey(eventType) && subscribersByEventType[eventType].Count > 0)
        {
            if (eventReportsTypes.ContainsKey(eventType))
            {
                Type         eventReportType = eventReportsTypes[eventType];
                BlDataStruct o = (BlDataStruct)Activator.CreateInstance(eventReportType);

                var eventReportData = new EventReportEncoder(pduPtr, o);

                o.SenderId   = eventReportData.SenderId;
                o.ReceiverId = eventReportData.ReceiverId;

                foreach (var field in eventReportType.GetFields())
                {
                    field.SetValue(o, eventReportData.Read(field.FieldType, field));
                }

                foreach (var subscriber in subscribersByEventType[eventType])
                {
                    subscriber(o);
                }
            }
        }
    }