Как пометить созданные методы как устаревшие? - PullRequest
4 голосов
/ 25 февраля 2009

Я использую строго типизированный DataSet, для которого ручное добавление строк будет подвержено ошибкам. Я предоставляю фабричные методы для правильного создания строк. Я хотел бы отвести потребителей моего класса от сгенерированных Add*Row методов на *Table классах.

Добавление Устаревшие атрибуты к сгенерированным методам поможет. К сожалению, они будут удалены при следующем генерировании кода.

Я не могу использовать частичные методы в не сгенерированном коде, поскольку дизайнер VS2008 DataSet их не использует.

MyType.Dataset.Designer.cs выглядит примерно так:

public partial class ThingyDataTable : global::System.Data.DataTable, global::System.Collections.IEnumerable {
    // I'd love an [Obsolete("Please use the factory method.")] here.
    // I can't use a partial method, as this method isn't partial. 
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public ShelfRow NewShelfRow()  
        return ((ShelfRow)(this.NewRow()));
    }
 }

Есть ли способ добавить атрибут Obsolete из MyType.cs? Попытка прототипа в стиле C не работает, так как член уже определен. Глушение в partial не работает, потому что сгенерированный элемент не partial.

// BROKEN EXAMPLE:
public partial class ThingyDataTable {
    // I'd love an [Obsolete("Please use the factory method.")] here.
    // I can't use a partial method, as this method isn't partial. 
    [Obsolete("Please use the factory method.")]
    public ShelfRow NewShelfRow(); // ERROR: member already defined.
}

Есть ли другой способ, которым я могу пометить сгенерированный метод Obsolete?

Как еще можно предупредить потребителей от сгенерированного метода?

Ответы [ 4 ]

1 голос
/ 09 октября 2014

Используйте ключевое слово new в вашем не сгенерированном частичном классе:

public partial interface ICaseRepository
    : IRepository<Case>
{
    void Delete(int id);

    [Obsolete("Use Delete(int id) instead.")]
    new void Delete(Case entity);
}

Это позволит всем текущим применениям сгенерированного метода генерировать предупреждения времени компиляции.

1 голос
/ 06 марта 2009

Другой вариант - использовать PostSharp 1.5 и новый аспект CustomAttributeInjector (см. электронная документация ).

По сути, создайте CompoundAspect и добавьте CustomAttributeInjectorAspect к чему угодно. Это должно работать.

-gael

1 голос
/ 25 февраля 2009

Пользовательский инструмент, используемый для генерации файла конструктора из XSD-файла, не так много настраивается из коробки.

Но вы можете либо:

  • Удалите его из диалогового окна «Свойства» в файле xsd для вашего типизированного набора данных, то есть для поля «Пользовательский инструмент» из «MSDataSetGenerator» установлено пустое значение. Таким образом, вы контролируете, когда ваш код генерируется. Но это подвержено ошибкам, так как вы можете забыть сделать это в будущем ...
  • Вы можете создать свой собственный пользовательский инструмент, который будет вызывать инструмент xsd.exe, и размещать нужный атрибут в соответствующих местах, но это означает, что вы устанавливаете пользовательский инструмент на всех своих станциях разработки и серверах сборки. (См. этот пост для указателей)
  • Или, наконец, вы можете заставить генератор кода создать внутреннюю реализацию вашего DataSet и заставить классы реализовать набор открытых интерфейсов, которые вы можете разрешить использовать вашим клиентам. Ваши классы набора данных не будут использоваться напрямую где-либо за пределами ваших сборок, но ваши интерфейсы будут.

Последнее немного менее "автоматично", так как вам нужно будет отразить изменения в схеме DataSet в ваших интерфейсах, но вы управляете всем и более "дружественным к фабрике".

0 голосов
/ 25 февраля 2009

Это сгенерированный код, верно. Ничто не мешает вам использовать выходные данные генератора в качестве входных данных для следующего генератора, который добавляет для вас атрибут [Устаревший].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...