Каков наилучший способ контролировать порядок, в котором возвращенные значения свойств возвращаются? - PullRequest
0 голосов
/ 23 декабря 2009

У меня есть один класс, который наследует другой. Я хочу использовать отражение для циклического перебора свойств и записи значений в файл. Нет проблем. За исключением того, что я хочу контролировать порядок, в котором свойства выписывают. Есть ли чистый способ сделать это? Прямо сейчас проблема 1 заключается в том, что свойства в подклассе записывают, а затем записывают proepries в родительском классе. Но я также могу пропустить некоторые свойства или просто изменить их порядок.

Вот мой код сейчас ...

foreach (PropertyInfo bp in t.GetProperties())
{
    Type pt = bp.PropertyType;

    if ((pt.IsArray) && pt.FullName == "System.Char[]")
    {
        char[] caPropertyValue;
        caPropertyValue = (char[])(bp.GetValue(oBatch, null));
        string strPropertyValue = new string(caPropertyValue);
        myBatch.Add(strPropertyValue);
    }
}

Ответы [ 3 ]

3 голосов
/ 23 декабря 2009

Самый простой способ - упорядочить их по имени - в алфавитном порядке. Вы также можете сгруппировать их по классам, к которым они принадлежат, а затем упорядочить каждую группу по имени. LINQ делает такие операции относительно простыми:

foreach( PropertyInfo bp in t.GetProperties()
                             .OrderBy( p => p.Name ) 
{...}

или

foreach( PropertyInfo bp in t.GetProperties()
                             .OrderBy( p => p.Name )
                             .GroupBy( p => p.DeclaringType.FullName )
                             .OrderBy( g => g.Key )
                             .SelectMany( g => g ) )
{...}
1 голос
/ 23 декабря 2009

Вы можете создать свой собственный атрибут, т. Е. '' 'OrderAttribute' '' и разместить его над свойством такие как

public class Man
{
   [Order(0)]
   string Name {get; set;}
   [Order(1)]
   int virtual Age {get; set;}
}
public class SuperMan:Man
{
   [Order(-1)]
   override int Age {get; set;}
}

в процедуре сортировки вы можете проверить значение атрибута заказа с помощью pi.GetCustomAttribute () и отсортировать пи по нему.

0 голосов
/ 23 декабря 2009

проверить синтаксис GetProperties. Есть параметр, который сообщает, хотите ли вы атрибуты только для текущего класса или, как вы просите, для всей цепочки наследования. Вам придется пройтись по структуре вашего класса, чтобы найти атрибуты на каждом уровне.

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