简体   繁体   English

有没有办法获取我可以在通用方法中使用的类型列表?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM