特定顺序的属性

时间:2014-02-06 06:04:32

标签: c# reflection

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

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,年龄

2 个答案:

答案 0 :(得分:2)

[Caution:在你自己的讨论中使用,因为这些显然是微软的impl细节,在未来的版本中可能会有所改变]

更新:单声道seems to work too

我发现自从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; }

    }
}

答案 1 :(得分:1)

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