C# 订阅动态类型列表
我在程序中使用Messenger,使用Subscribe和publish方法。 我想订阅特定对象的消息类型列表(实现接口“IMessage”)。 所以,我有一个方法订阅。 应该是这样的:C# 订阅动态类型列表,c#,generics,types,C#,Generics,Types,我在程序中使用Messenger,使用Subscribe和publish方法。 我想订阅特定对象的消息类型列表(实现接口“IMessage”)。 所以,我有一个方法订阅。 应该是这样的: subscribe(List<T> listMessagesTypes) { foreach(IMessage messageType in listMessagesTypes) _messenger.subscribe<messageType>(doActio
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)
为什么这会被否决?我也不知道为什么。。。!