Переместите Foo и Foo‹T› с помощью ReSharper в соответствующие файлы

Код

Я хотел бы использовать функцию ReSharper Переместить типы в соответствующие файлы, чтобы переместить приведенный ниже код, который написан одним .cs'. файл:

public abstract class Foo
{

}

public abstract class Foo<T> : Foo
{

}

Выполнение рефакторинга ReSharper вызывает это исключение:

Невозможно переместить класс Foo, так как есть другое объявление, которое будет перемещено в файл «Foo.cs».

Вопрос

Я могу думать о двух результатах, которые меня устраивают:

  1. Переместите оба Foo и Too<T> в Foo.cs
  2. Переместите Foo в Foo.cs и переместите Foo<T> в FooOfT.cs

Итак, остается вопрос:

  1. Есть ли другая лучшая практика именования, которая не конфликтует с resharper? или
  2. Есть ли способ настроить ReSharper для поддержки этого именования?

Примечание

  • Поскольку обобщения уникальны для каждой возможной комбинации ограничений, класс Foo является моим классом интерфейса. Поэтому я не буду переименовывать Foo<T> в Bar<T>.
  • Я не хочу переименовывать Foo в FooBase, так как это уже абстрактный класс, который делает явный суффикс "Base" излишним.
  • Я не могу преобразовать Foo в IFoo, так как Foo — это мой концептуальный интерфейс (из-за необходимой базовой реализации.

person Myrtle    schedule 06.09.2013    source источник
comment
Иногда я называл универсальные файлы Foo`1.cs для обозначения одного аргумента универсального типа в Foo. Но это не использование ReSharper.   -  person Adam Houldsworth    schedule 06.09.2013
comment
В Microsoft они используют ClassNameOfT.cs. stackoverflow.com/a/804114/781792   -  person Tim S.    schedule 06.09.2013
comment
@ТимС. Это как раз мое второе предложение. Однако похоже, что, к сожалению, ReSharper не поддерживает это соглашение об именах.   -  person Myrtle    schedule 06.09.2013
comment
@MauriceStam Это будет работать, пока у вас не будет что-то вроде собственного Tuple с несколькими аргументами типа, но в разных файлах, лол.   -  person Adam Houldsworth    schedule 06.09.2013
comment
Создайте папку для одного или другого или две папки, по одной для каждого. Тогда они могут иметь одинаковое имя файла.   -  person Jesse C. Slicer    schedule 06.09.2013
comment
@ JesseC.Slicer Спасибо за предложение. К сожалению, это не решение, потому что я хотел бы, чтобы структура папок соответствовала структуре пространства имен.   -  person Myrtle    schedule 06.09.2013


Ответы (2)


Насколько я знаю, нет никакого способа сказать Resharper добавить общие параметры имени файла. Он просто использует имя класса, то есть Foo, Foo<T> и Foo<A, B, C> все имеют Foo.cs в качестве имени файла, но — и в этом проблема — ReSharper, похоже, не знает, что такая возможность существует, и покажет вам ошибку в этом сценарии. На самом деле вы ничего не можете с этим поделать, кроме как регистрировать ошибку или запрос функции.

person Daniel Hilgarth    schedule 06.09.2013

Вы можете рассмотреть такие варианты:

  • Используйте 1_
  • Измените Foo на интерфейс, если это возможно, и используйте IFoo
  • Используйте GenericFoo
  • Используйте разные пространства имен для Foo и Foo<T> и поместите их в разные папки.
person Ahmed KRAIEM    schedule 06.09.2013
comment
К сожалению, Foo уже является моим «концептуальным» классом интерфейса. Однако мне нужна базовая реализация, поэтому я использую абстрактный класс вместо интерфейса С#. - person Myrtle; 06.09.2013
comment
Вы также можете разработать плагин Resharper, который делает то, что вы хотите. - person Ahmed KRAIEM; 06.09.2013