2014-10-21 3 views
3

У меня есть пара классов. Они буквально копировать/вставить из моего проекта:Компактный синтаксис для статического метода Create() для универсального класса?

public static class PageResult 
{ 
    public static PageResult<T> Create<T>(int totalCount, IList<T> items) 
    { 
     return new PageResult<T>() 
     { 
      TotalCount = totalCount, 
      Items = items, 
     }; 
    } 
} 

public class PageResult<T> 
{ 
    public int TotalCount { get; set; } 
    public IList<T> Items { get; set; } 
} 

Причина, почему я сделал это так, что я мог бы использовать PageResult.Create(5, listOf5Items) в отличие от любого другого синтаксиса более длительного. Я не поместил метод Create в класс PageResult(T), потому что я уверен, что вместо этого мне нужно ввести PageResult<int>(5, listOf5Numbers), и это лишние пять символов ...

Но наличие двух классов для этого кажется довольно хромым. Есть ли способ получить более компактный синтаксис, не имея класс throwaway для его хранения?

+1

Если это хромает, хороший фрагмент базовой библиотеки .NET также хромает, потому что этот шаблон используется совсем немного и фактически продвигается в [Framework Design Руководящие принципы] (http://blogs.msdn.com/b/kcwalina/archive/2004/03/15/89860.aspx) (более старый, но по-прежнему актуальный). –

ответ

2

Как вы уже отметили, вам нужно будет указать параметры типа, чтобы даже получить доступ к функции Create, потому что этот конкретный класс PageResult<T> не существует даже до тех пор, пока JIT не создаст его, когда метод начнет его вызывать. См. Tuples для экземпляра .NET Framework, который делает именно этот шаблон по той же причине.

Обратите внимание, что другой вариант, чтобы сделать PageResult класс не- static, и наследовать PageResult<T> : PageResult, который позволит Вам хранить коллекцию PageResult объектов без параметра типа. Это также может быть полезно, если вы используете abstract PageResult

+0

Если бы идея фрейм-кода не казалась такой же. Спасибо, что указали это. –

1

Нет. Вы могли бы создать фрагмент VS (или какой-либо другой плагин/инструмент, который мог бы генерировать исходный код), чтобы напечатать какой-либо шаблонный шаблон для вас, но в конце дня этот код должен быть там.

Смежные вопросы