C# 按特定顺序排列的属性

C# 按特定顺序排列的属性,c#,reflection,C#,Reflection,使用反射,我有一个获取类属性的工具: foreach (MemberInfo member in typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public)) { WriteValue(streamWriter, member.Name); } 是否有方法要求“GetProperties”按类中定义的顺序返回MemberInfo。我很怀疑,但我想我会问的 class Person { public

使用反射,我有一个获取类属性的工具:

foreach (MemberInfo member in typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public))
{
    WriteValue(streamWriter, member.Name);
}
是否有方法要求“GetProperties”按类中定义的顺序返回MemberInfo。我很怀疑,但我想我会问的

class Person
{
     public int Id { get; set; }
     public int Age { get; set; }
}

我想按以下顺序获取MemberInfo:Id,年龄

否,对于自动属性,没有。您可以使用调试符号按照声明的顺序获取方法,并且由于属性getter是方法,您可以(通过一些工作)按照声明的顺序获取带有显式getter(或setter)的属性列表,但是自动属性的getter没有源代码,因此没有调试符号来指示它们的位置。至于CLI元数据,编译器没有义务按声明顺序排列,而且由于反射完全依赖于元数据,因此不能将其用于此目的。

[
注意:
请自行决定使用,因为这些显然是Microsoft的impl详细信息,在未来版本中可能会更改]

更新:单声道

从v3.5开始,我就在使用MS编译器时观察到一致性行为,当时我偶然发现:

using System;
using System.Linq;
using System.Reflection;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {    
            typeof(Test).GetMembers(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
                .OrderBy(member => member.MetadataToken).ToList()
                .ForEach(member => Console.WriteLine(member.Name));

            Console.ReadLine();
        }
    }

    public class Test
    {
        public int SecondProperty { get; set; }
        public int FirstProperty { get; set; }

    }
}

也许你把一个问题分成了明显的和不可能的两部分。你需要这个做什么?