2010-12-08 31 views
1

Il y a deux minutes, j'ai eu l'idée de sélectionner des méthodes surchargées avec une interface. nous utilisons actuellement UIP à partir de blocs d'application Microsoft. ils utilisent une méthode OnEnterTask avec un paramètre d'objet dans chaque contrôleur. mais cela conduit à un désordre de vérification de type.Les génériques sont-ils un bon moyen de résoudre les méthodes surchargées?

donc je suis venu avec l'idée d'utiliser une interface pour sélectionner la bonne méthode:

interface IAcceptTaskArguments<TInputArguments> where TInputArguments : InputArguments 
{ 
    void OnEnterTask(TInputArguments arguments); 
} 

est-il une bonne pratique de faire quelque chose comme ceci pour éviter que-mess typage?

merci les gars.

+0

Pourquoi pas seulement cast au type qui correspond à la signature de la méthode? Ça va être aussi bavard. – cdhowie

+0

Pourriez-vous nous dire ce qu'est UIP et nous montrer la méthode OnEnterTask que MSFT a écrit dans le code? –

+0

un contrôleur peut être entré avec différents types d'arguments d'entrée et les appels à OnEnterTask sont très génériques. En raison du système de configuration de uip –

Répondre

1

Je préfère utiliser génériques par rapport à la méthode surchargeant. Lorsque la surcharge est nécessaire je préfère passer une instance d'une classe (ou d'une interface) ayant tous les paramètres, puis vérifier valeurs personnalisées par défaut pour chaque paramètre, si la valeur est la valeur par défaut cela signifie qu'aucune valeur n'a été donnée pour un tel paramètre .

Avec version 4.0 du Framework de Microsoft, il est plus facile d'utiliser les médicaments génériques parce que, il y a un mot-clé nommé dynamique par lequel vous pouvez appeler une méthode statique de méthodes génériques:

namespace Layer.Logic 
{ 
    public class EntityObjectCommands : LogicContextBase, IEntityObjectCommands 
    { 
     public Tresult Get<Tcommand, Tresult>(Tcommand command) where Tcommand : ICommandGet 
     { 
      Tresult result = default(Tresult); 
      DBEntityObjectCommands dbfactory = new DBEntityObjectCommands(GetDataServiceParam(dbserver)); 
      result = dbfactory.Get<Tcommand, Tresult>(command);  
      return result; 
     } 
    } 
} 
namespace Layer.Data 
{ 
    public class DBEntityObjectCommands : IEntityObjectCommands 
    { 
     public Tresult Get<Tcommand, Tresult>(Tcommand command) where Tcommand : ICommandGet 
     { 
      Tresult result = default(Tresult); 
      OleDbCommandInfo commandInfo = DBCommandProvider<Tcommand>.Get(command); 

      //-- implement logic to use [commandInfo] ........... 

      return result; 
     }  
    } 
    public static class DBCommandProvider<Tcommand> where Tcommand : ICommand 
    { 
     public static OleDbCommandInfo Get(Tcommand command) 
     { 
      return DBCommands.Get((dynamic)command); 
     } 
    } 
}