C# 订阅动态类型列表

C# 订阅动态类型列表,c#,generics,types,C#,Generics,Types,我在程序中使用Messenger,使用Subscribe和publish方法。 我想订阅特定对象的消息类型列表(实现接口“IMessage”)。 所以,我有一个方法订阅。 应该是这样的: subscribe(List<T> listMessagesTypes) { foreach(IMessage messageType in listMessagesTypes) _messenger.subscribe<messageType>(doActio

我在程序中使用Messenger,使用Subscribe和publish方法。 我想订阅特定对象的消息类型列表(实现接口“IMessage”)。 所以,我有一个方法订阅。 应该是这样的:

subscribe(List<T> listMessagesTypes)
{
     foreach(IMessage messageType in listMessagesTypes)
        _messenger.subscribe<messageType>(doAction);
}
subscribe(列出listMessagesTypes)
{
foreach(listMessagesTypes中的IMessage messageType)
_订阅(doAction);
}
当然,这是行不通的

  • 我无法定义列表只包含实现接口IMessage的类型

  • messageType是一个对象,而不是一个类型。我的代码语法错误


有人知道我如何处理它吗?

除非在编译时知道它的类型,否则不能使用泛型subscribe方法。

你可以试试:

void subscribe(List<Type> listMessagesTypes, Action doAction)
{
   foreach (Type messageType in listMessagesTypes)         
     if (typeof(IMessage).IsAssignableFrom(messageType)
       _messenger.subscribe(messageType, doAction);
}
void subscribe(列出listMessagesTypes、Action-doAction)
{
foreach(在listMessagesTypes中键入messageType)
if(typeof(IMessage).IsAssignableFrom(messageType)
_订阅(messageType,doAction);
}

但是,您仍然需要实现一个接受类型的subscribe方法。

您可以使用反射来订阅多个类型:

// You need to change List<T> to List<Type>, and you need to only pass types here
public void subscribe(List<Type> listMessagesTypes)
{
    foreach(Type messageType in listMessagesTypes)
    {
        // find method "subscribe" on Messenger type
        MethodInfo method = typeof(Messenger).GetMethod("subscribe");

        // create a generic definition of method with specified type
        MethodInfo genericMethod = method.MakeGenericMethod(messageType);

        // invoke this generic method
        // the assumption is that your method signature is like this: doAction(IMessage message)
        genericMethod.Invoke(_messenger, new object[] { new Action<IMessage>(doAction)});
    }
}
//您需要将列表更改为列表,并且只需在此处传递类型
公共作废订阅(列表listMessagesTypes)
{
foreach(在listMessagesTypes中键入messageType)
{
//在Messenger类型上查找方法“subscribe”
MethodInfo method=typeof(Messenger).GetMethod(“订阅”);
//创建具有指定类型的方法的泛型定义
MethodInfo genericMethod=method.MakeGenericMethod(messageType);
//调用此通用方法
//假设您的方法签名如下:doAction(IMessage消息)
调用(_messenger,新对象[]{newAction(doAction)});
}
}
该方法的调用方式如下:

var listOfTypes = new List<Type>{ typeof(MessageA), typeof(MessageB)};
subscribe(listOfTypes);
var listOfTypes=新列表{typeof(MessageA),typeof(MessageB)};
订阅(类型列表);

如果你想知道它是否实现了一个接口,你可以对它进行测试:
IMessage myTest=myObject作为IMessage If(myTest!=null)
或者干脆
If(myObject是IMessage)
为什么这会被否决?我也不知道为什么。。。!