10
votes

Puis-je créer une liste >?

J'ai une classe xxx

maintenant, je veux créer un iList > mais avec différents types de réglage 's y dans y, je veux par exemple xxx

J'ai essayé ilist > mais cela ne semble pas impossible puisque le compilateur ne trouve pas de type t .

Je sais que je pourrais utiliser l'objet, mais je veux que cela soit fortement typé. Donc, ma question est de savoir s'il est possible d'obtenir ce travail.


3 commentaires

Voulez-vous dire, par exemple, vous avez paramètre et paramètre , et vous souhaitez avoir une liste contenant ces deux?


Réponse associée C # - Types génériques multiples dans une liste


@BoltClock a édité ma question pour le rendre plus clair


5 Réponses :


0
votes

Vous devez utiliser une classe d'ancêtres commune pour tous les types de classe que vous avez mis dans la liste. Si ce sont des types arbitraires, vous devez utiliser objet pour t


0 commentaires

13
votes

Les types génériques ne possèdent pas de type ou d'interface commun entre définitions de béton par défaut.

ont votre paramètre Classe implémente une interface (ou dériver d'une classe commune) et créer un Liste de cette interface (ou classe). xxx


1 commentaires

+1 Vous pouvez ajouter nom de chaîne publique {obtenir; ensemble; } à instinct pour préciser que l'interface commune ne peut contenir que les opérations communes avec une signature commune sur toutes les classes héritantes.



0
votes

Vous pouvez utiliser t uniquement à l'intérieur de votre classe: xxx

non pas à l'extérieur. Dehors, vous devez spécifier le type de béton: xxx

ou xxx


0 commentaires

0
votes

Vous pouvez le faire en utilisant la réflexion J'ai écrit ce code pour une autre question, mais vous pouvez utiliser ce xxx

et l'appeler comme ceci xxx


0 commentaires

-1
votes
/// <summary>
/// 消息回调委托
/// </summary>
/// <typeparam name="T">TClass</typeparam>
/// <param name="result">返回实体</param>
/// <param name="args">内容包</param>
public delegate void CallbackHandler<in T>(T result, BasicDeliverEventArgs args);

/// <summary>
/// 注册监听程序接口
/// </summary>
public interface IRegistration
{
    /// <summary>
    /// 路由名称
    /// </summary>
    string ExchangeName { get; }

    /// <summary>
    /// 路由Key
    /// </summary>
    string RouteKey { get; }

    /// <summary>
    /// 回调操作
    /// </summary>
    /// <param name="args"></param>
    void Call(BasicDeliverEventArgs args);
}

/// <summary>
/// 注册监听程序
/// </summary>
/// <typeparam name="T"></typeparam>
public class Registration<T> : IRegistration where T : class
{
    /// <summary>
    /// 路由名称
    /// </summary>
    public string ExchangeName { get; set; }

    /// <summary>
    /// 路由Key
    /// </summary>
    public string RouteKey { get; set; }

    /// <summary>
    /// 消息处理器委托
    /// </summary>
    public CallbackHandler<T> Handler { get; set; }

    /// <summary>
    /// 接口回调操作
    /// </summary>
    /// <param name="args"></param>
    public void Call(BasicDeliverEventArgs args)
    {
        var message = Encoding.UTF8.GetString(args.Body.ToArray());
        Handler?.Invoke(JsonConvertHandler.DeserializeObject<T>(message), args);
    }
}

/// <summary>
/// 消息监听处理器
/// </summary>
public static class ListenerHandler
{
    /// <summary>
    /// 单任务锁
    /// </summary>
    private static readonly object Locker = new object();

    /// <summary>
    /// 所有注册列表
    /// </summary>
    public static List<IRegistration> Registrations { get; private set; }

    /// <summary>
    /// 单例化
    /// </summary>
    static ListenerHandler()
    {
        List<ListenerSetting> listeners = MqNoticeHandler.Setting.GetListeners();
        MqNoticeHandler.Listener(OnMessage, listeners);
    }

    /// <summary>
    /// 注册监听
    /// </summary>
    /// <param name="registration"></param>
    public static void Register(IRegistration registration)
    {
        lock (Locker)
            Registrations.Add(registration);
    }

    /// <summary>
    /// 解除注册
    /// </summary>
    /// <param name="registration"></param>
    public static void UnRegister(IRegistration registration)
    {
        lock (Locker)
            Registrations.Remove(registration);
    }

    /// <summary>
    /// 获取监听列表
    /// </summary>
    /// <param name="exchangeName"></param>
    /// <param name="routeKey"></param>
    /// <returns></returns>
    public static IEnumerable<IRegistration> GetRegistrations(string exchangeName, string routeKey)
    {
        return Registrations.Where(x => x.ExchangeName == exchangeName && x.RouteKey == routeKey);
    }

    /// <summary>
    /// 消息回调处理
    /// </summary>
    /// <param name="consumer">消费者</param>
    /// <param name="args">消息包</param>
    /// <returns></returns>
    private static MqAckResult OnMessage(EventingBasicConsumer consumer, BasicDeliverEventArgs args)
    {
        //Example Query and Call 
        Registrations.First().Call(args);

        //Return
        return new MqAckResult { Accept = true, ReQueue = false };
    }
}

3 commentaires

Il est difficile de comprendre comment cela répond à la question, d'autant plus que vous n'expliquez rien.


Mon anglais est très piscine, désolé.


Dans des circonstances normales, vous utiliserez le type entrant, vous devez donc mettre en œuvre la méthode d'appel de l'interface pour rappeler à votre demandeur. Vous devez donc définir un délégué pour être transmis à votre demandeur et définissez une interface pour normaliser l'opération de rappel. Implémentez la classe pour hériter de l'interface et implémenter la méthode de rappel. Ce qui précède est généré par Google Traduction