2010-12-08 15 views
1

Vor zwei Minuten kam ich auf die Idee, überladene Methoden mit einer Schnittstelle zu wählen. verwenden wir derzeit UIP von Microsoft-Anwendungsblöcken. Sie verwenden eine OnEnterTask-Methode mit einem Objektparameter in jedem Controller. , aber dies führt zu einem Typ-Check-Chaos.Sind Generika eine gute Möglichkeit, überladene Methoden zu lösen?

so kam ich auf die Idee, eine Schnittstelle zu verwenden, um die richtige Methode zu wählen:

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

ist es eine gute Übung, um so etwas zu tun, dass die Typprüfung-Chaos zu vermeiden?

danke Jungs.

+0

Warum nicht einfach in den Typ umwandeln, der mit der Signatur der Methode übereinstimmt? Es wird genauso ausführlich sein. – cdhowie

+0

Können Sie uns sagen, was UIP ist und uns die OnEnterTask-Methode zeigen, die MSFT im Code geschrieben hat? –

+0

ein Controller kann mit verschiedenen Eingabeargumenttypen eingegeben werden und die Aufrufe von OnEnterTask sind sehr generisch. Wegen des Konfigurationssystems von uip –

Antwort

1

Ich bevorzuge Generika gegenüber Methode überladen. Wenn Überladen erforderlich ist, übergebe ich lieber eine Instanz einer Klasse (oder einer Schnittstelle) mit allen Parametern und überprüfe dann für jeden Parameter benutzerdefinierte Standardwerte, wenn der Wert der Standardwert ist, bedeutet dies, dass für diesen Parameter kein Wert angegeben wurde .

Mit Version 4.0 von Microsoft Framework-, ist es einfacher, Generika zu verwenden, da gibt es einige Keyword dynamische, mit dem Namen ist, können Sie eine statische Methode von generischen Methoden aufrufen:

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); 
     } 
    } 
} 
Verwandte Themen