我正在研究一种在目标类型上寻找Parse方法的类型转换器。它被发现没有问题,并调用就好了。问题是,在将特定CultureInfo
传递给Invoke
方法时,它无效。
演示代码:
const BindingFlags flags = BindingFlags.Public | BindingFlags.Static;
var parser = typeof(decimal).GetMethod("Parse", flags, null, new[] { typeof(string) }, null);
var result1 = parser.Invoke(null, flags, null, new[] { "123,456" }, CultureInfo.GetCultureInfo("sv-SE"));
var result2 = parser.Invoke(null, flags, null, new[] { "123,456" }, CultureInfo.GetCultureInfo("en-US"));
Console.WriteLine(result1);
Console.WriteLine(result2);
结果(使用瑞典语区域设置):
123,456
123,456
所发生的事情是Parse
方法正在运行,但我传递给CultureInfo
的{{1}}会被忽略。瑞典调用应该将逗号识别为十进制,并且美国调用应该将逗号识别为千位分隔符。
假设Invoke
的{{1}}参数是什么? MSDN说
CultureInfo的一个实例用于管理类型的强制。如果为null,则使用当前线程的CultureInfo。 (例如,这是将表示1000的String转换为Double值所必需的,因为1000由不同的文化表示不同。)
在将参数传递给您正在调用的方法而不是在调用期间操纵CultureInfo
时,这是否与内部转换有关?在我按这里之前,我只想弄明白这一点。我可能需要找到包含CultureInfo参数的Parse方法......此时我将放弃这个想法。
答案 0 :(得分:1)
你的假设是正确的; CultureInfo
仅在Invoke
内使用,以转换参数。
您需要将CultureInfo
传递给方法本身,而不是Invoke
。