似乎由于某种原因,property.GetValue忽略了CultureInfo。这是我试图实现的目标:
public static IEnumerable<string> GetViewModelProperties(this IDocumentViewModel vm) {
foreach (var property in vm.GetType().GetProperties().Where(p => (p.PropertyType.IsPrimitive ||
p.PropertyType.GetInterfaces().Any(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IEnumerable<>))) &&
p.GetIndexParameters().Count() == 0))
{
yield return property.Name + ":" + property.GetValue(vm, System.Reflection.BindingFlags.GetProperty, null, null, System.Globalization.CultureInfo.InvariantCulture);
}
}
我只是使用
保存到磁盘System.IO.File.WriteAllText("filename.txt", settings.ToString());
并在结果文件中,对于属性Frequency类型为double的值为50.33,我得到了
Frequency:50,33
是CurrentCulture(波兰语使用昏迷作为分隔符),但不是
Frequency:50.33
正如我所期待的那样。什么想法可能是错的?
答案 0 :(得分:3)
PropertyInfo的GetValue函数返回一个对象,而不是一个字符串 - 这就是代码中的误解。该对象被转换为字符串,因为+运算符的第一个参数是字符串(property.Name),但CultureInfo不应用于该字符串转换。
解决方案是明确使用Convert.ToString(object,IFormatProvider)函数,即
yield return property.Name + ":" + Convert.ToString(property.GetValue(vm, System.Reflection.BindingFlags.GetProperty, null, null, System.Globalization.CultureInfo.InvariantCulture), System.Globalization.CultureInfo.InvariantCulture);