ResourceManager.GetString returns 空

ResourceManager.GetString returns null

我正在尝试读取一些嵌入在名为 SQLUpdateScripts 的 resx 文件中的 .sql 文件。我在 SQLupdateScripts.resx 中的所有文件都采用 00001.sql、00002.sql、0003.sql 等格式。 我想读取每个 sql 文件的内容并根据两个变量

执行它
for (int i = DbVersion+1; i <= FileDbVersion; i++)
            {
                 string updateScripts = "script_" + i.ToString("D5");
....
var sqlqueries = myString.Split(new[] { "\nGO", "\ngo" }, StringSplitOptions.RemoveEmptyEntries);
etc....

我在 Whosebug 中尝试了很多建议,但所有建议都是 returning null 或 exception

ResourceManager sqLUpdateScripts = new ResourceManager(typeof(SQLUpdateScripts));
                string myString = sqLUpdateScripts.GetString(updateScripts);

还有

object[] args = new object[] { updateScripts };

SQLUpdateScripts obj = new SQLUpdateScripts();
obj.GetType().InvokeMember(updateScripts,
BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty,
Type.DefaultBinder, obj, args);

每个 sql 文件的 SqlUpdateScripts.Designer.cs 中的代码是

internal static string script_00001 
    {
        get {
            return ResourceManager.GetString("script_00001", resourceCulture);
            }
    }
internal static string script_00002 
   {
        get {
            return ResourceManager.GetString("script_00002", resourceCulture);
        }
    }  

我读到我必须使用反射调用每个文件作为方法,方法是使用 invokeMember 给我无法找到 class SqlUpdateScripts.script_0001 的异常。 当我尝试使用 ResourceManager 时,它只是 return myString as null.

如果我手动打电话:

var sqlqueries = SQLUpdateScript.script_0001.Split(new[] { "\nGO", "\ngo" }, StringSplitOptions.RemoveEmptyEntries);

它工作正常,但我想为文件名使用变量而不是标准文件名

我发现了问题。 这是我犯的转储错误。我在 DBVersion 和 fileDBVersion 中测试时给出了错误的值,所以当我使用

for (int i = DbVersion+1; i <= FileDbVersion; i++)

它没有给我价值script_00001而是给了我价值script_01001 所以现在它正在工作,我发现您可以通过两种方式将文件作为 resx 文件中的字符串调用

第一个:

ResourceManager sqLUpdateScripts = new ResourceManager(typeof(SQLUpdateScripts));
string myString = sqLUpdateScripts.GetString(updateScripts);

第二种方式:

string resVal = SQLUpdateScripts.ResourceManager.GetString(updateScripts, Thread.CurrentThread.CurrentCulture);

第二种方式的 GetString 有两个重载,一个是没有 CultureInfo,一个是指定 CultureInfo,例如,如果您想调用另一种语言。

不知道有没有办法避免以后调用错误的resx资源时出错,也许有办法枚举所有资源,然后只选择一个。

如果我找到方法,我会添加到这里。