使用自定义属性对FieldList进行排序

利兹夫

我想按特定顺序检索对象中的字段。我找到了一种使用反射来检索字段的方法,但是不能保证每次都以相同的顺序返回字段。这是我用来检索字段的代码:

ReleaseNote rn = new ReleaseNote();
Type type = rn.GetType();
FieldInfo[] fi = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic);

我找到了另一个问题的答案,该问题说明了如何添加自定义属性并使用它对字段进行排序。基于此,我相信我需要通过创建自定义属性“ MyOrderAttribute”来更新我的代码以按排序顺序检索字段,该属性将用于对FieldInfo数组进行排序。

在这里,我创建了属性并将其添加到我的字段中:

namespace TestReleaseNotes
{
    [AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
    public class MyOrderAttribute : Attribute
    {
        public MyOrderAttribute(int position)
        {
            this.Position = position;
        }

        public int Position { get; private set; }
    }

    class ReleaseNote
    {
        [MyOrder(0)]
        private string title;
        [MyOrder(1)]
        private string status;
        [MyOrder(3)]
        private string implementer;
        [MyOrder(3)]
        private string dateImplemented;
        [MyOrder(4)]
        private string description;

在这里,我尝试使用该属性对字段列表进行排序:

ReleaseNote rn = new ReleaseNote();
Type type = rn.GetType();
FieldInfo[] fi = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic).OrderBy(f => f.Position);

这给了我错误:“'FieldInfo不包含'Position'的定义,并且找不到可访问的扩展方法'Position'接受类型为'FieldInfo'的第一个参数(您是否缺少using指令或程序集引用?) ”

我还尝试了GetCustomAttribute方法,该方法产生错误“'MyOrderAttribute'是一种类型,在给定上下文中无效”:

FieldInfo[] fi = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic).OrderBy(f => f.GetCustomAttribute(MyOrderAttribute);

访问MyOrderAttribute并使用它对字段进行排序的正确语法是什么?

最高

使用以下表达式:

FieldInfo[] fi = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic).OrderBy(f => (int?)(f.CustomAttributes.Where(a=>a.AttributeType==typeof(MyOrderAttribute)).FirstOrDefault()?.ConstructorArguments[0].Value) ?? -1).ToArray();

?。和?? 运算符在这里处理没有排序属性的字段。它默认将无序字段设置为-1(即,在有序列表的开头)。将其替换为int.MaxValue或9999,以将无序字段放在最后。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Jquery Datatables对数据排序属性中的值进行自定义排序

如何通过自定义属性对Type属性进行排序

按属性对自定义对象的ArrayList进行排序

在多个属性上对 NSArray 自定义对象进行排序

使用mergesort vs自定义排序对arraylist进行排序

如何使用Unix排序进行自定义排序?

使用自定义排序算法对卡片组进行排序

如何使用自定义管道在Angular中按属性值对对象数组进行排序?

使用自定义比较器对ArrayList <String>进行排序

使用jquery或Javascript进行自定义表格排序

使用自定义API进行排序-removeAndAppend

使用自定义顺序对 Django 查询集进行排序

使用Angular的orderBy指令进行自定义排序

使用自定义谓词对numpy数组进行排序

使用自定义列表对Dataweave进行排序

使用AngularJs在ngTable中进行自定义排序

使用pageable对自定义JPA查询进行排序

使用自定义联接表主键对BelongsToMany进行排序

使用Spinner Android对自定义Listview项进行排序

使用const成员对自定义对象的向量进行排序

使用自定义比较功能进行c ++排序

在ruby中使用自定义值系统进行排序

使用自定义IComparer按日期对DataGridView进行排序

Swift:使用自定义顺序按键对字典进行排序

使用 JQuery 数据表进行自定义排序

使用 Nest 库进行弹性搜索自定义排序

如何使用自定义订单属性对枚举排序?

按属性对对象列表进行排序 C#(自定义排序顺序)

使用映射对数组进行自定义属性委派