public void DetachAllSigEventHandlers()
 {
     BooleanOutput.Where(bo => bo.UserObject is UnifiedSigUserObject).ToList().ForEach(bo => bo.UserObject = ((UnifiedSigUserObject)bo.UserObject).UserObject);
     UShortOutput.Where(uo => uo.UserObject is UnifiedSigUserObject).ToList().ForEach(uo => uo.UserObject  = ((UnifiedSigUserObject)uo.UserObject).UserObject);
     StringOutput.Where(so => so.UserObject is UnifiedSigUserObject).ToList().ForEach(so => so.UserObject  = ((UnifiedSigUserObject)so.UserObject).UserObject);
     UShortInput.Where(ui => ui.UserObject is UnifiedSigUserObject).ToList().ForEach(ui => ui.UserObject   = ((UnifiedSigUserObject)ui.UserObject).UserObject);
 }
        private void OnSigChange(SigEventArgs args)
        {
            UnifiedSigEventArgs usea = new UnifiedSigEventArgs(args);

            switch (args.Event)
            {
            case eSigEvent.BoolOutputSigsCleared:
                BooleanOutput.Where(bo => bo.UserObject is UnifiedSigUserObject && ((UnifiedSigUserObject)bo.UserObject).UnifiedSigEvents != null).Select(bo => ((UnifiedSigUserObject)bo.UserObject).UnifiedSigEvents).ToList().ForEach(lc => lc.FindAll(u => u.SigChange != null && (u.eSigEvent == eSigEvent.NA || u.eSigEvent == eSigEvent.BoolChange)).ForEach(u => u.SigChange(this, usea)));
                break;

            case eSigEvent.UShortOutputSigsCleared:
                UShortOutput.Where(uo => uo.UserObject is UnifiedSigUserObject && ((UnifiedSigUserObject)uo.UserObject).UnifiedSigEvents != null).Select(uo => ((UnifiedSigUserObject)uo.UserObject).UnifiedSigEvents).ToList().ForEach(lc => lc.FindAll(u => u.SigChange != null && (u.eSigEvent == eSigEvent.NA || u.eSigEvent == eSigEvent.UShortChange)).ForEach(u => u.SigChange(this, usea)));
                break;

            case eSigEvent.StringOutputSigsCleared:
                StringOutput.Where(so => so.UserObject is UnifiedSigUserObject && ((UnifiedSigUserObject)so.UserObject).UnifiedSigEvents != null).Select(so => ((UnifiedSigUserObject)so.UserObject).UnifiedSigEvents).ToList().ForEach(lc => lc.FindAll(u => u.SigChange != null && (u.eSigEvent == eSigEvent.NA || u.eSigEvent == eSigEvent.StringChange)).ForEach(u => u.SigChange(this, usea)));
                break;

            default:
                var uuo = args.Sig.UserObject as UnifiedSigUserObject;
                if (uuo == null)
                {
                    return;
                }

                if (uuo.UnifiedSigEvents == null || uuo.UnifiedSigEvents.Count == 0)
                {
                    args.Sig.UserObject = uuo.UserObject;
                    return;
                }

                switch (args.Sig.Type)
                {
                case eSigType.Bool:
                    usea.BoolValue = args.Sig.BoolValue;
                    break;

                case eSigType.UShort:
                    usea.UShortValue = args.Sig.UShortValue;
                    break;

                case eSigType.String:
                    usea.StringValue = args.Sig.StringValue;
                    break;
                }

                uuo.UnifiedSigEvents.FindAll(u => u.SigChange != null && (u.eSigEvent == eSigEvent.NA || u.eSigEvent == args.Event)).ForEach(u => u.SigChange(this, usea));
                break;
            }
        }