Являются ли дженерики хорошим способом решения перегруженных методов? - PullRequest
1 голос
/ 08 декабря 2010

две минуты назад у меня возникла идея выбрать перегруженные методы с интерфейсом.в настоящее время мы используем UIP из блоков приложений Microsoft.они используют метод OnEnterTask с одним параметром объекта в каждом контроллере.но это приводит к путанице при проверке типов.

, поэтому мне пришла в голову идея использовать интерфейс для выбора правильного метода:

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

это хорошая практика, чтобы что-то делатькак это, чтобы избежать этого беспорядка проверки типов?

спасибо, ребята.

1 Ответ

1 голос
/ 08 декабря 2010

Я предпочитаю использовать генерики против перегрузки метода .Когда требуется перегрузка, я предпочитаю передавать экземпляр класса (или интерфейса), имеющий все параметры, а затем проверять настроенные по умолчанию значения для каждого параметра, если значение является значением по умолчанию, это означает, что значение не былодля такого параметра.

С версией 4.0 Microsoft Framework проще использовать дженерики, потому что есть некое ключевое слово с именем dynamic , с помощью которого можно вызватьстатический метод из универсальных методов:

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 );
        }
    }   
}
...