J'ai une classe maintenant, je veux créer un J'ai essayé 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. P> p> iList > code> mais avec différents types de réglage ilist t code>. p>
5 Réponses :
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 code> pour t code> p>
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
+1 Vous pouvez ajouter nom de chaîne publique {obtenir; ensemble; } code> à instinct code> 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.
Vous pouvez utiliser non pas à l'extérieur. Dehors, vous devez spécifier le type de béton: p> ou p> t code> uniquement à l'intérieur de votre classe:
Vous pouvez le faire en utilisant la réflexion
J'ai écrit ce code pour une autre question, mais vous pouvez utiliser ce et l'appeler comme ceci p>
/// <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 };
}
}
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
Voulez-vous dire, par exemple, vous avez
paramètre code> et paramètre code>, 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