我可以在 Prism 的事件聚合器上使用反射吗?



我试图在PRISM框架中重构我的一些方法,但它并没有真正奏效。

我需要通过EventAggregator发布消息,并且我已经编写了一个反射方法,该方法将通过包含TypeList<Parameters>并从这里发送消息。但是它从不发送任何消息。

结果显示as PubSubEvent<object>public class Input: PubSubEvent<Output> {}不一样,这意味着returnObj?.Publish(data);null,不会被调用。

public struct Parameters
{
    public string Topic;
    public Type Input;
    public Type Output;
}

private List<Parameters> _list;
...
void SomeFunction()
{
    _list.ForEach(m =>
    {
        var data = JsonConvert.DeserializeObject(dataString, m.Output);
        var eventAggType = _eventAggregator.GetType();
        var eventMethod = eventAggType.GetMethod("GetEvent");
        var genericMethod = eventMethod.MakeGenericMethod(m.Input);
        var returnObj = genericMethod.Invoke(_eventAggregator, null) as PubSubEvent<object>;
        returnObj?.Publish(data);
        // var datType = returnObj.GetType();
        // if (datType.BaseType.Name == typeof (PubSubEvent<object>).Name)
        // {
        //  var obj = Convert.ChangeType(returnObj, datType);
        //  ((PubSubEvent<object>) obj).Publish(data);
        // }
    }
}

我试图通过查看它实际输出的类型来修改代码(删除as PubSubEvent<object>),它是相同的BaseType。但是转换为基本的PubSubEvent并不是程序所高兴的。

Exception thrown: 'System.InvalidCastException' in MyProject.ModuleA.dll
EXCEPTION: Unable to cast object of type 'MyProject.ModuleA.GlobalEvents.EventA' to type 'Microsoft.Practices.Prism.PubSubEvents.PubSubEvent`1[System.Object]'.

我如何Publish与正确的类型?如果你知道你在处理什么类,它应该像下面这样:

_eventAggregator.GetEvent<EventA>().Publish(data);

如何将泛型类型传递给void SomeFunction()

void SomeFunction<T>()
{
    // ..............
    var returnObj = genericMethod.Invoke(_eventAggregator, null) as PubSubEvent<T>;
    returnObj?.Publish(data);
}

// call it like:
SomeFunction<DataObject>();

更新:

从一个类型调用一个泛型方法,可以这样做:

void SomeFunction<T>()
{
    // ..............
    var returnObj = genericMethod.Invoke(_eventAggregator, null) as PubSubEvent<T>;
    returnObj?.Publish(data);
}

// call it like:
// this is the type you want to pass.
Type genericType = typeof(int);
// get the MethodInfo
var someFunctionMethodInfo = typeof(Program).GetMethod("SomeFunction", BindingFlags.Public);
// create a generic from it
var genericSomeFunctionMethodInfo = someFunctionMethodInfo.MakeGenericMethod(genericType);
// invoke it.
genericSomeFunctionMethodInfo.Invoke(null, new object[] { });

我真傻。这是反射——更多的反射!

void SomeFunction()
{
    _list.ForEach(m =>
    {
        //Deserialize the data
        var data = JsonConvert.DeserializeObject(dataString, m.Output);
        //Obtain the object from the EventAggregator
        var eventAggType = _eventAggregator.GetType();
        var eventMethod = eventAggType.GetMethod("GetEvent");
        var genericMethod = eventMethod.MakeGenericMethod(m.Input);
        var returnObj = genericMethod.Invoke(_eventAggregator, null);
        //Publish the data
        var publishMethod = returnObj.GetType().GetMethod("Publish");
        publishMethod.Invoke(returnObj, new[] {data});
    });
}

因此,您取反射returnObj,并从反射对象returnObj中反射函数Publish(...)Invoke,并使用data参数。

相关内容

  • 没有找到相关文章

最新更新