RabbitMq EasyNetQ使用Activator.CreateInstance创建消息

时间:2013-04-29 19:28:23

标签: c# rabbitmq easynetq

我有一个我不完全明白的问题。 当我以这种方式创建消息时,它可以工作:

var message = new StartFakeJobCommand();
using (var publishChannel = ApplicationSingleton.Instance.RabbitBus.OpenPublishChannel())
{
    publishChannel.Publish(message);
}

消息放在队列中,我的监听器可以使用它。 但是,当我使用 Activator.CreateInstance 创建一条消息时,它不起作用。没有任何内容发布到队列中。

var t = Type.GetType(string.Format("{0}.{1},{2}", job.CommandNamespace, job.Command, job.AssemblyName));
if (t == null)
    throw new ArgumentException();

var message = Activator.CreateInstance(t);
using (var publishChannel = ApplicationSingleton.Instance.RabbitBus.OpenPublishChannel())
{
    publishChannel.Publish(message);
}

在调试过程中,我可以清楚地看到使用这两种方法创建了相同的类型。 知道为什么第二种方法不起作用吗?

这是我订阅邮件的方式:

bus.Subscribe<StartFakeJobCommand>("StartFakeJobCommand_ID", message => fakeJob.Handle(message));

1 个答案:

答案 0 :(得分:1)

Activator.CreateInstance的签名是:

public static Object CreateInstance(
    Type type
)

消息的类型是Object,因此您的消息将作为Object类型发布,并且由于您没有Object的订阅者,因此它是黑洞。

使用正确的通用类型调用publishChannel.Publish来解决问题。