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资源时出错,也许有办法枚举所有资源,然后只选择一个。
如果我找到方法,我会添加到这里。
我正在尝试读取一些嵌入在名为 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资源时出错,也许有办法枚举所有资源,然后只选择一个。
如果我找到方法,我会添加到这里。