使用反射我有一个获取类属性的工具:
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,年龄
答案 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元数据,编译器没有义务按声明的顺序放置它们,并且由于反射完全依赖于元数据,因此不能用于此目的。