为了账号安全,请及时绑定邮箱和手机立即绑定

使用反射按声明顺序获取属性

使用反射按声明顺序获取属性

沧海一幻觉 2019-10-29 10:48:04
我需要按照在类中声明它们的顺序使用反射来获取所有属性。根据MSDN,使用时无法保证顺序GetProperties()GetProperties方法不按特定顺序(例如字母顺序或声明顺序)返回属性。但是我读过,有一种解决方法,可以通过排序属性MetadataToken。所以我的问题是,这样安全吗?我似乎找不到有关MSDN的任何信息。还是有其他解决方法?我当前的实现如下所示:var props = typeof(T)   .GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)   .OrderBy(x => x.MetadataToken);
查看完整描述

3 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

根据MSDN, MetadataToken一个模块内部是唯一的-没什么可说的是它可以保证任何订单。


即使它确实按照您希望的方式运行,也将是特定于实现的,并且随时可能更改,恕不另行通知。


请参阅此旧的MSDN博客条目。


我强烈建议您不要依赖任何此类实现细节-请参阅Marc Gravell的回答。


如果您在编译时需要一些东西,可以看一下Roslyn(尽管它还处于早期阶段)。


查看完整回答
反对 回复 2019-10-29
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

如果要使用属性路由,这是我过去使用的方法;


public static IOrderedEnumerable<PropertyInfo> GetSortedProperties<T>()

{

  return typeof(T)

    .GetProperties()

    .OrderBy(p => ((Order)p.GetCustomAttributes(typeof(Order), false)[0]).Order);

}

然后像这样使用它;


var test = new TestRecord { A = 1, B = 2, C = 3 };


foreach (var prop in GetSortedProperties<TestRecord>())

{

    Console.WriteLine(prop.GetValue(test, null));

}

哪里;


class TestRecord

{

    [Order(1)]

    public int A { get; set; }


    [Order(2)]

    public int B { get; set; }


    [Order(3)]

    public int C { get; set; }

}

如果您在所有属性上都没有可比较属性的类型上运行该方法,则该方法将受到禁止,因此请小心使用它的方式,它应足以满足要求。


我省略了Order:Attribute的定义,因为Yahia到Marc Gravell的帖子的链接中有一个很好的示例。


查看完整回答
反对 回复 2019-10-29
  • 3 回答
  • 0 关注
  • 1038 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信