Възможно ли е да се създаде псевдоресурс в движение, без да се използва .resx файл с помощта на ResourceManager?

Имам ресурсен файл strings.resx в моя проект, който съхранява английски низове по подразбиране. С цел тестване създадох още един файл strings.zh-CN.resx, но съхранените там низове не са истински китайски. Те са просто тестови низове, които са генерирани след добавяне на някои знаци към низовете, съхранени в strings.resx (основен ресурсен файл). Когато потребител влезе в zh-CN култура, този файл помага да се уловят твърдо кодирани данни и непреведени низове. Възможно ли е да мога да се отърва от файла strings.zh-CN.resx и да генерирам фалшив ресурс в движение, когато текущата култура на нишката е zh-CN?

По принцип - има ли някакви начини, по които можем да подведем ResourceManager да върне фалшиви низове за определени култури, без да имаме физически .resx файл?

Използвам автоматично генерирания файл designer.cs на Visual Studio за извличане на ресурс. Виждам във файла designer.cs, че има едно статично свойство за всеки низ в .resx файла. Начинът, по който ResourceManager се инициализира в designer.cs, е както по-долу.

/// <summary>
///   Returns the cached ResourceManager instance used by this class.
/// </summary>

    [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
    public static global::System.Resources.ResourceManager ResourceManager {
        get {
            if (object.ReferenceEquals(resourceMan, null)) {
                global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("xxx.xxx.Strings", typeof(Strings).Assembly);
                resourceMan = temp;
            }
            return resourceMan;
        }
    }

Това е начинът, по който статичното свойство се добавя от автоматично генериран код.

/// <summary>
///   Looks up a localized string similar to Absolute.
/// </summary>
public static string Absolute {
    get {
        return ResourceManager.GetString("Absolute", resourceCulture);
    }
}

Търся точки за разширение в това извличане. ако е възможно, искам да закача моя собствен персонализиран ResourceManager (или нещо друго, за което не съм сигурен) и да върна фалшив псевдо низ, когато културата е zh-CN. Основната цел е, че не искам да генерирам фалшив файл с физически ресурси само с цел тестване.


person murtazat    schedule 14.05.2015    source източник
comment
моля, добавете допълнителна информация към въпроса си чрез редактиране и ги премахнете от коментарите.   -  person Alex    schedule 15.05.2015
comment
BTW, ResourceManager е част от .NET, а не част от C#   -  person John Saunders    schedule 15.05.2015


Отговори (1)


Разбира се можете да. Разбирате ли как ResourceManager работи? Има много начини да постигнете това, което искате. Една двойка са тези:

ЕДНА ОПЦИЯ: Вижте кода зад файл с ресурси. Той ви казва, че трябва да създадете инстанция на ResourceManager на някакъв етап. Един от начините да направите това е да предоставите името на тип ресурс (известен още като базово име) и сборката, в която може да бъде намерен. Направи същото! Това ще ви накара да разберете, че ще ви трябва и тип ресурс (клас) в движение - така че направете това: създайте един тип ресурс, преди да създадете екземпляр на ResourceManager. Типът трябва да има публично свойство с името на фалшивия низ, който искате да извлечете. Пример как да направите това е даден тук: Stackoverflow: Динамично създаване на клас в C#.

ДРУГА ОПЦИЯ: Запознайте се с това как работи макетна рамка като Moq. Можете да приложите същата идея за фалшифициране на тип ресурс. Така че вместо да създавате тип ресурс в движение, можете да имате макет на ресурс, който може да бъде научен да връща вашите _fake stri

person Quality Catalyst    schedule 14.05.2015
comment
Благодаря. Опитвам се да разбера вариант 1. Мисля, че изглежда приличен подход, но проблемът е как това може да се направи във файла designer.cs, който се генерира автоматично. Предоставя ли някакви точки за разширение? - person murtazat; 15.05.2015
comment
Имам предвид как да подмамите рамката за локализация, за да повярвате, че съществуват фалшиви низове в някакъв фалшив клас (създаден от подхода, който споменахте) по време на изпълнение. Как да заредя такъв клас, който съдържа фалшиви низове? - person murtazat; 15.05.2015
comment
Знам, че искам твърде много, но моля, предоставете проба от код на опция 1 в контекста на файла designer.cs, който е генериран от Visual Studio. Благодаря ти много. - person murtazat; 15.05.2015
comment
Хей @murtazat, предлагам да се запознаете с кода зад него и да прочетете статии за мениджъра на ресурси. Самият мениджър е клас, който идва с .NET framework, докато ресурсните файлове са технически генерирани класове за достъп - това е причината зад него да има автоматично генериран код. Ако имате само низове във вашия ресурс, тогава всичко се намира в генерирания изходен код. Сега помислете още една стъпка: Ако имате нужда от клас (тип), за да удовлетворите мениджъра на ресурсите, тогава ще трябва да го предоставите по един или друг начин. В .NET няма измами. Вариант 1 обяснява един начин да направите това. - person Quality Catalyst; 15.05.2015