У делегата моей функции пустая цельC#

Место общения программистов C#
Ответить
Anonymous
 У делегата моей функции пустая цель

Сообщение Anonymous »

Я использую ROS или ZMQ в Unity для связи со своим устройством и хочу, чтобы мой код можно было адаптировать к обоим методам без необходимости рефакторинга всего моего кода. Затем я создал класс интерфейса, который обеспечивает связь между моим основным кодом и коммуникационной библиотекой. Однако при подписке на тему ROS мне нужно использовать функцию обратного вызова для получения данных. Но мой обратный вызов никогда не вызывается, и когда я проверяю цель делегата, она равна нулю, даже если я указал это при создании.
Вот основной класс , который определяет подписчика и запрашивает создание интерфейса. Я помещаю с комментариями результаты каждой команды отладки. Поскольку тип сообщений в ROS и ZMQ различается, я использую псевдоним, определенный для ROS следующим образом: public override Type TypeFloatArrayAlias ​​{ get; } = typeof(Float32MultiArrayMsg);.
// ... (class RobotCommand)

try
{
var defineSubscriberMethod = m_interface.GetType().GetMethod("DefineSubscriber");
var genericMethod = defineSubscriberMethod.MakeGenericMethod(m_interface.TypeFloatArrayAlias);
var delegateType = typeof(Action).MakeGenericType(m_interface.TypeFloatArrayAlias);

var methodInfo = this.GetType().GetMethod(nameof(UpdateVirtualRobotJointsCallback),
BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
if (methodInfo == null)
throw new Exception("Method 'UpdateVirtualRobotJointsCallback' not found.");

Debug.Log($"Method Info: {methodInfo.Name} Target: {this.GetType().Name}");
// Method Info: UpdateVirtualRobotJointsCallback Target: RobotCommand
Delegate callbackDelegate = Delegate.CreateDelegate(delegateType, this, methodInfo);
Debug.Log($"Delegate Target: {callbackDelegate.Target}, Method: {callbackDelegate.Method}");
// Delegate Target: null, Method: Void UpdateVirtualRobotJointsCallback(RosMessageTypes.Std.Float32MultiArrayMsg)

genericMethod.Invoke(m_interface, new object[]
{
Const.ROS_NAMESPACE + "robot_joint_values",
callbackDelegate
});
}
catch (Exception e)
{
Debug.LogError($"Error invoking DefineSubscriber: {e.Message}");
}
}

public void UpdateVirtualRobotJointsCallback(Float32MultiArrayMsg msg)
{
Debug.Log("called");
StartCoroutine(m_controller.MoveRobot_Coroutine(m_interface.ToFloatArray(msg)));
}

Вот метод DefineSubscriber интерфейса:
public override void DefineSubscriber(string topic, Action callback)
{
try
{
Debug.Log($"Delegate Callback: Target={callback.Target}, Method={callback.Method}");
// Delegate Callback: Target=null, Method=Void UpdateVirtualRobotJointsCallback(RosMessageTypes.Std.Float32MultiArrayMsg)

Type msgType = typeof(T);
// _node is the ROS object (ROSConnection.GetOrCreateInstance())
var subscribeMethod = _node.GetType().GetMethod("Subscribe").MakeGenericMethod(msgType);
subscribeMethod.Invoke(_node, new object[] { topic, callback });

_subscriberList[topic] = (x => callback((T)x), msgType);
Debug.Log($"Subscriber created for topic: {topic} with message type: {msgType.Name}");
}
catch (Exception e)
{
Debug.LogError($"Error while defining subscriber for topic {topic}: {e.Message}");
}
}

Я не понимаю, почему цель моего обратного вызова равна нулю. Думаю, именно поэтому он никогда не вызывается, поскольку не связан с объектом.
К вашему сведению, вот рабочее творение подписчика:
void Start()
{
ROSConnection.GetOrCreateInstance().Subscribe(m_topicName, UpdateVirtualRobotJointsCallback);
}

// Update is called once per frame
void Update()
{

}

void UpdateVirtualRobotJointsCallback(Float32MultiArrayMsg msg)
{
Debug.Log("called");
StartCoroutine(xarmController.MoveRobot_Coroutine(new List(msg.data)));
}


Подробнее здесь: https://stackoverflow.com/questions/790 ... ull-target
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»