Как сделать наследование файлов ресурсов (resx) - PullRequest
9 голосов
/ 29 июля 2011

Представьте, что вы работаете над проектом .Net 4.0, который состоит из сотен сборок, каждая из которых имеет свой собственный файл ресурсов (.resx) для локализации. Доступ к локализованным строкам осуществляется из C # через классы, автоматически сгенерированные с помощью ResXFileCodeGenerator (который создает файл "ResourceFile.Designer.cs"): string test = ResourceFile.TestString;

Каждая сборка имеет локализованные строки, которые свойственны ей, но есть строки, которые являются общими для всех сборок. Вы говорите себе, что было бы неплохо иметь эти «общие строки» в «родительском» файле ресурсов, к которому код мог бы обращаться, если ключ ресурса не доступен в «локальном» файле ресурсов. Затем вы говорите: «Эй! Наследство может работать здесь». И действительно, выполнение чего-то подобного в автоматически сгенерированном файле конструктора работает: internal class ResourceFile : ParentResourceFile То есть к строкам, не определенным в ResourceFile, но определенным в ParentResourceFile, можно получить доступ с помощью ResourceFile.StringInParentFile.

Но что-то в заголовке файла дизайнера беспокоит вас: " Изменения в этом файле могут привести к некорректному поведению, и будет потеряно, если код будет восстановлен . " Кроме того, вы знаете, что играете в автоматически сгенерированные дизайнерские файлы не одобряются. Итак, вы приходите сюда и спрашиваете:

  • Когда ResXFileCodeGenerator генерирует / восстанавливает конструктор учебный класс?
  • Есть ли способ отключить эту автогенерацию?
  • Будем ли мы иметь отказаться от преимуществ ResXFileCodeGenerator и реализовать наши собственная обработка ResourceManager?

А вы говорите "спасибо".

1 Ответ

5 голосов
/ 26 августа 2011

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

Вы тольконеобходимо иметь базовый класс, чей проект включает в себя «основной» файл ресурсов, и установить для свойства CustomTool этого файла ресурсов значение PublicResXFileCodeGenerator (часть «Public» важна, поскольку она создает класс public, так какв отличие от internal).Одно ограничение заключается в том, что PublicResXFileCodeGenerator доступен только начиная с VS2008 (в противном случае этот CodeProject article может быть полезен).

Затем в классах, которым требуется доступ к "основным" ресурсам, просто наследуйте отбазовый класс и доступ к ресурсам следующим образом:

public class ChildClass : BaseClass
{
    string test = BaseClass.BaseResourceFile.TestString; // a common resource
    string localResource = ResourceFile.OtherString;     // a local resource
}

Один недостаток этого решения заключается в том, что вам необходимо явно ссылаться на BaseResourceFile для доступа к определенным там ресурсам;нет возврата к родительскому классу, как это было бы, если бы наследование осуществлялось непосредственно между классами Resource.

А для потомков я отвечу на свои вопросы:

  • Когда ResXFileCodeGenerator генерирует / восстанавливает класс конструктора?

    Всякий раз, когда ресурс добавляется / удаляется / изменяется.

  • Есть лиспособ выключить это автоматическое поколение?

    Нет.И вообще, инструмент «генератор кода» без автогенерации был бы довольно бесполезен, не правда ли?

  • Придется ли нам отказаться от преимуществ ResXFileCodeGenerator и реализоватьнаша собственная обработка ResourceManager?

    Нет, см. ответ выше.

Мы также рассматривали реализацию решения с использованием «связанных» файлов (из «Добавить существующее»элемент ", используя опцию" Добавить как ссылку "), где один родительский файл ресурсов будет связан со всеми нашими сборками, но поскольку наши сборки уже наследуются от базового класса, казалось, что гораздо лучше пойти по пути наследования.

Мне не очень комфортно принимать мой собственный ответ, поэтому, если кто-то придумает лучшее решение или улучшения моего решения, я с радостью приму это.То есть, если кому-то все равно.

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