我可以在Prism的EventAggregator上使用反射吗?

时间:2015-10-21 14:02:47

标签: c# reflection prism eventaggregator

我正在尝试重构PRISM框架中的一些方法,但它并没有真正解决。

我需要通过EventAggregator发布消息,并且我编写了一个反射方法,该方法将查看包含List<Parameters>的{​​{1}}并从此处发送消息。 但它从不发送任何消息。

事实证明,safecast Typeas 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

2 个答案:

答案 0 :(得分:1)

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

void SomeFunction<T>()
{
    // ..............

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


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

<强>更新

从Type中调用泛型方法可以这样做:

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[] { });

答案 1 :(得分:0)

傻傻的我。这是反思 - 更多的反思!

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反射Publish(...),并使用Invoke参数反映来自反射对象returnObj的函数data和{{1}}