InterfacedActorRef IActorBoundChannelSync.BindActor(InterfacedActorRef actor, ActorBindingFlags bindingFlags)
        {
            if (actor == null)
            {
                throw new ArgumentNullException(nameof(actor));
            }

            var targetActor = actor.CastToIActorRef();

            if (targetActor == null)
            {
                throw new ArgumentException("InterfacedActorRef should have valid IActorRef target.");
            }

            var actorId = BindActor(targetActor, new[] { new BoundType(actor.InterfaceType) }, bindingFlags);

            if (actorId == 0)
            {
                return(null);
            }

            var actorRef = (InterfacedActorRef)Activator.CreateInstance(actor.GetType());

            InterfacedActorRefModifier.SetTarget(actorRef, new BoundActorTarget(actorId));

            return(actorRef);
        }
        InterfacedActorRef IActorBoundGatewaySync.OpenChannel(InterfacedActorRef actor, object tag, ActorBindingFlags bindingFlags)
        {
            var targetActor = actor.CastToIActorRef();

            if (targetActor == null)
            {
                throw new ArgumentNullException(nameof(actor));
            }

            var target = ((IActorBoundGatewaySync)this).OpenChannel(targetActor, new TaggedType[] { actor.InterfaceType }, bindingFlags);

            var actorRef = (InterfacedActorRef)Activator.CreateInstance(actor.GetType());

            InterfacedActorRefModifier.SetTarget(actorRef, target);
            return(actorRef);
        }
        InterfacedActorRef IActorBoundGatewaySync.OpenChannel(InterfacedActorRef actor, object tag, ActorBindingFlags bindingFlags)
        {
            var targetActor = actor.CastToIActorRef();
            if (targetActor == null)
                throw new ArgumentNullException(nameof(actor));

            var target = ((IActorBoundGatewaySync)this).OpenChannel(targetActor, new TaggedType[] { actor.InterfaceType }, bindingFlags);

            var actorRef = (InterfacedActorRef)Activator.CreateInstance(actor.GetType());
            InterfacedActorRefModifier.SetTarget(actorRef, target);
            return actorRef;
        }
        InterfacedActorRef IActorBoundChannelSync.BindActor(InterfacedActorRef actor, ActorBindingFlags bindingFlags)
        {
            if (actor == null)
                throw new ArgumentNullException(nameof(actor));

            var targetActor = actor.CastToIActorRef();
            if (targetActor == null)
                throw new ArgumentException("InterfacedActorRef should have valid IActorRef target.");

            var actorId = BindActor(targetActor, new[] { new BoundType(actor.InterfaceType) }, bindingFlags);
            if (actorId == 0)
                return null;

            var actorRef = (InterfacedActorRef)Activator.CreateInstance(actor.GetType());
            InterfacedActorRefModifier.SetTarget(actorRef, new BoundActorTarget(actorId));

            return actorRef;
        }