[英]Is there a way to get a list of types that i can use in Generic Methods?
Hi so what I wanted is something along the lines of, is it possible in c#?嗨,我想要的是类似于 c# 的东西吗? ~
~
(and without using reflection?) (并且不使用反射?)
Current:当前的:
protected override void AddTelegrams()
{
TelegramPublisher.Subscribe<Telegram1>(TelegramReceived);
TelegramPublisher.Subscribe<Telegram2>(TelegramReceived);
TelegramPublisher.Subscribe<Telegram3>(TelegramReceived);
}
protected override void RemoveTelegrams()
{
TelegramPublisher.UnSubscribe<Telegram1>(TelegramReceived);
TelegramPublisher.UnSubscribe<Telegram2>(TelegramReceived);
TelegramPublisher.UnSubscribe<Telegram3>(TelegramReceived);
}
Objective:客观的:
private IEnumerable<Type> GetListTelegramTypes()
{
return new List<Type>()
{
typeof(Telegram1),
typeof(Telegram2),
typeof(Telegram3)
};
}
protected override void AddTelegrams()
{
foreach (var type in GetListTelegramTypes())
TelegramPublisher.Subscribe<type>(TelegramReceived);
}
protected override void RemoveTelegrams()
{
foreach (var type in GetListTelegramTypes())
TelegramPublisher.UnSubscribe<type>(TelegramReceived);
}
Also Subscribe and Unsubscribe generic type mas be or inherit from "Telegram"...订阅和取消订阅泛型类型也可以是或继承自“电报”......
If you don't want to use reflection, you can do something like:如果您不想使用反射,可以执行以下操作:
public interface ITelegramSubscriber
{
void Subscribe(TelegramReceivedHandler handler);
void Unsubscribe(TelegramReceivedHandler handler);
}
public class TelegramSubscriber<T> : ITelegramSubscriber
{
public void Subscribe(TelegramReceivedHandler handler) =>
TelegramPublisher.Subscribe<T>(handler);
public void Unsubscribe(TelegramReceivedHandler handler) =>
TelegramPublisher.Unsubscribe<T>(handler);
}
Then:然后:
private IEnumerable<ITelegramSubscriber> GetListTelegramSubscribers()
{
return new List<ITelegramSubscriber>()
{
new TelegramSubscriber<Telegram1>(),
new TelegramSubscriber<Telegram2>(),
new TelegramSubscriber<Telegram3>(),
new TelegramSubscriber<Telegram4>(),
};
}
protected override void AddTelegrams()
{
foreach (var subscriber in GetListTelegramSubscribers())
subscriber.Subscribe(TelegramReceived);
}
protected override void RemoveTelegrams()
{
foreach (var subscriber in GetListTelegramSubscribers())
subscriber.Unsubscribe(TelegramReceived);
}
This assumes that you have one TelegramReceivedHandler
method type which handles all telegrams.这假设您有一种
TelegramReceivedHandler
方法类型来处理所有电报。 If you in fact have multiple overloads (it isn't clear from your question), then you probably want something like:如果您实际上有多个重载(从您的问题中不清楚),那么您可能想要类似的东西:
public interface ITelegramSubscriber
{
void Subscribe();
void Unsubscribe();
}
public class TelegramSubscriber<T> : ITelegramSubscriber
{
private readonly TelegramReceivedHandler<T> handler;
public TelegramSubscriber(TelegramReceivedHandler<T> handler) => this.handler = handler;
public void Subscribe() => TelegramPublisher.Subscribe<T>(handler);
public void Unsubscribe() => TelegramPublisher.Unsubscribe<T>(handler);
}
Then:然后:
private IEnumerable<ITelegramSubscriber> GetListTelegramSubscribers()
{
return new List<ITelegramSubscriber>()
{
new TelegramSubscriber<Telegram1>(TelegramReceived),
new TelegramSubscriber<Telegram2>(TelegramReceived),
new TelegramSubscriber<Telegram3>(TelegramReceived),
new TelegramSubscriber<Telegram4>(TelegramReceived),
};
}
protected override void AddTelegrams()
{
foreach (var subscriber in GetListTelegramSubscribers())
subscriber.Subscribe();
}
protected override void RemoveTelegrams()
{
foreach (var subscriber in GetListTelegramSubscribers())
subscriber.Unsubscribe();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.