C#按原始顺序获取FieldInfos/PropertyInfos?

Wil*_*ill 27 c#

如何将类型FieldInfos/PropertyInfos作为MemberInfo数组按照它们在类中布局的顺序获取?

class Test
{
    public bool First { get; set; }
    public int Second;
    public string Third { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 27

http://msdn.microsoft.com/en-us/library/ch9714z3.aspx

GetFields方法不按特定顺序返回字段,例如按字母顺序或声明顺序.您的代码不得依赖于返回字段的顺序,因为该顺序会有所不同.

http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx

GetProperties方法不以特定顺序返回属性,例如按字母顺序或声明顺序.您的代码不得依赖于返回属性的顺序,因为该顺序会有所不同.

您需要自己定义顺序,可能还有属性:

class Test
{
    [Order(1)] public bool First { get; set; }
    [Order(2)] public int Second;
    [Order(3)] public string Third { get; set; }
}
...
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, 
    Inherited = true, AllowMultiple = false)]
[ImmutableObject(true)]
public sealed class OrderAttribute : Attribute {
    private readonly int order;
    public int Order { get { return order; } }
    public OrderAttribute(int order) {this.order = order;}
}
Run Code Online (Sandbox Code Playgroud)

  • 所以你是否知道XmlSerializer如何获得订单?这个框架是内部的吗? (3认同)
  • @High我的想法是:你确切知道它在构建之间的表现如何?它稳定吗?有保证吗?或者*如果它有效,是偶然的,可能会在2个构建时间内更改,或者当您更改.NET Service Pack或CPU架构时? (3认同)
  • 那么LayoutKind.Sequential呢?这表明在某处有关于声明排序的信息. (2认同)
  • @Jeff好,部分; 不完全的; 特别是,我从规范中引用10.2.6:10.2.6成员[...]类型中成员的排序对C#代码来说很少有意义,但在与其他语言和环境接口时可能很重要.在这些情况下,**在多个部分中声明的类型中的成员的顺序是未定义的**.(强调我的) (2认同)