使用反射调用时设置CultureInfo

时间:2011-03-29 22:38:48

标签: c# reflection cultureinfo

我正在研究一种在目标类型上寻找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方法......此时我将放弃这个想法。

1 个答案:

答案 0 :(得分:1)

你的假设是正确的; CultureInfo仅在Invoke内使用,以转换参数。

您需要将CultureInfo传递给方法本身,而不是Invoke