【问题标题】:Properties in a particular order特定顺序的属性
【发布时间】:2014-03-02 22:42:58
【问题描述】:

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

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、Age

【问题讨论】:

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

标签: c# reflection


【解决方案1】:

[Caution: 请自行决定使用,因为这些显然是 Microsoft 的 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; }

    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 2013-02-11
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 2017-01-18
      相关资源
      最近更新 更多