Вы можете использовать отражение, чтобы прочитать имена всех свойств класса в порядке их объявления.Затем вы можете уточнить это в своей логике и соответствующим образом отсортировать поля.
Попробуйте выполнить следующее:
PropertyInfo[] propertyInfos = typeof(Bar).GetProperties();
foreach (var propInfo in propertyInfos)
Console.WriteLine(propInfo.Name);
Это запишет все свойства в классе Bar
(это простоНапример, вы можете заменить это любым из ваших классов), включая свойства, унаследованные от его суперкласса (BaseClass
).Ожидаемый результат:
Organization
Keywords
Id
Name
Description
Owner
DateAdded
Обратите внимание, что этот метод сначала перечисляет свойства класса, а затем идет вверх по иерархии, перечисляя каждый суперкласс (вот почему члены Bar
перечислены раньше BaseClass
участников).Вы можете разработать код немного больше, чтобы изменить порядок в соответствии с вашими потребностями.
Следующий (неоптимизированный) код сначала создает список всей иерархии данного класса, начиная с базового класса.по направлению к данному T
классу.После этого он выполняет итерацию по каждому из классов, обнаруживая только свойства, определенные в каждом классе (я передаю методу GetProperties()
параметр, указывающий, что мне просто нужны свойства, которые public , instance / non-static и , объявленные для определенного класса, с которым я сейчас обращаюсь ).
private static void ListAllOrderedPropertiesOfType(Type targetType)
{
// Generate a list containing the whole hierarchy of classes, from the base type to the type T
var typesList = new List<Type>();
for (Type t = targetType; t != typeof(Object); t = t.BaseType)
typesList.Insert(0, t);
// Iterate from the base type to type T, printing the properties defined for each of the types
foreach (Type t in typesList)
{
PropertyInfo[] propertyInfos = t.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (var propInfo in propertyInfos)
Console.WriteLine(propInfo.Name);
}
}
Так что если вы хотите знать все свойства для типа Bar
, упорядоченный от самого верхнего базового класса к классу Bar
, этот метод можно было бы назвать так:
ListAllOrderedPropertiesOfType(typeof(Bar));
Ожидаемые выходные данные будут иметь свойства в следующем порядке:
Id
Name
Description
Owner
DateAdded
Organization
Keywords
При этом вы знаете порядок объявления полей и их пользовательские порядки (через атрибут CustomAttr
).Теперь вы можете реализовать метод сортировки, чтобы упорядочить поля в соответствии с их порядками объявления и CustomAttr
порядками, в соответствии с вашими потребностями.
Но я полагаю, что это немного выходит за рамки моего ответа (который намереваетсяпокажет вам, как получить порядок объявления свойств от базового класса к любому конкретному классу).