Используйте пользовательский атрибут для сортировки FieldList - PullRequest
0 голосов
/ 30 января 2019

Я хочу получить поля в моем объекте в определенном порядке.Я нашел способ использовать отражение для извлечения полей, но не гарантируется, что поля будут возвращаться в том же порядке каждый раз.Вот код, который я использую для извлечения полей:

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 не содержитопределение 'Позиция' и недоступный метод расширения 'Позиция', принимающий первый аргумент типа 'FieldInfo', может быть найден (вы пропустили директиву using или ссылку на сборку?) "

Я также попробовал GetCustomAttributeметод, который выдает ошибку «MyOrderAttribute - это тип, который недопустим в данном контексте»:

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

Каков правильный синтаксис для доступа к MyOrderAttribute и использования его для сортировки моих полей?

1 Ответ

0 голосов
/ 30 января 2019

Используйте следующее выражение:

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();

the?.а также ??операторы здесь, чтобы иметь дело с полями без упорядочивания атрибута.По умолчанию неупорядоченные поля установлены в -1 (то есть в начале упорядоченного списка).Замените его на int.MaxValue или 9999, чтобы поставить неупорядоченные поля в конец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...