【发布时间】:2020-06-01 19:38:38
【问题描述】:
我使用反射来获取一个类的属性列表。我需要以与代码中声明的顺序完全相同的顺序获取名称。
当我只打电话给typeof(TypeOfClass).GetProperties() 时,我得到了良好的属性。
在我的项目中添加的一些代码产生了一些影响我构建的反射读取。
花了一段时间才找到它,但几个小时后,我发现你得到了一个名称为 GetProperty("name") 的属性,它可以在进一步调用 GetProperties() 时更改顺序
这是重现相同问题的代码(控制台应用程序):
class Program
{
private class SomeClass
{
public int IntProperty { get; set; }
public string StringProperty { get; set; }
public DateTime DateProperty { get; set; }
}
static void Main(string[] args)
{
PropertyInfo[] propertyInfos = typeof(SomeClass).GetProperties();
Console.WriteLine(string.Join(", ",propertyInfos.Select(p => p.Name)));
//Output: IntProperty, StringProperty, DateProperty
}
}
在GetProperties之前访问GetProperty的相同代码
class Program
{
private class SomeClass
{
public int IntProperty { get; set; }
public string StringProperty { get; set; }
public DateTime DateProperty { get; set; }
}
static void Main(string[] args)
{
PropertyInfo dateProp = typeof(SomeClass).GetProperty("DateProperty");
PropertyInfo[] propertyInfos = typeof(SomeClass).GetProperties();
Console.WriteLine(string.Join(", ",propertyInfos.Select(p => p.Name)));
//Output: DateProperty, IntProperty, StringProperty
}
}
如果执行第二个代码块,它将返回以 DateProperty 作为第一个索引的属性!?
有人知道为什么吗,有没有办法确保 GetProperties 总是以相同的顺序返回相同的列表?
PS:我只用 .netcore 3.1 试过这个。我认为这可能不是以前版本中的错误。
谢谢
【问题讨论】:
-
仅供参考:.Net Framework 4.7 没有问题,只是测试过......问题也存在于 .Net Core 2.0 中