2013-11-15 1 views
4
public class BaseDto 
{ 
    public int ID{ get; set; } 
} 
public class Client: BaseDto 
{ 
    public string Surname { get; set; } 
    public string FirstName{ get; set; } 
    public string email{ get; set; }  
} 

PropertyInfo[] props = typeof(Client).GetProperties(); 

Это будет список свойств в следующем порядке: Фамилия, FirstName, электронная почта, IDКак использовать отражение, чтобы получить свойства базового класса, прежде чем свойства производного класса

Хочет свойство в дисплей в следующем порядке: ID, фамилия, FirstName, электронная почта

ответ

1

Не уверен, что если есть более быстрый способ сделать это, но во-первых, получить тип базового типа, который вы унаследовали от.

typeof(Client).BaseType 

После этого вы можете получить только базовые свойства с помощью обязательных флагов.

BindingFlags.DeclaredOnly 

После этого сделайте то же самое для типа клиента и добавьте результат.

8

Возможно это?

// this is alternative for typeof(T).GetProperties() 
// that returns base class properties before inherited class properties 
protected PropertyInfo[] GetBasePropertiesFirst(Type type) 
{ 
    var orderList = new List<Type>(); 
    var iteratingType = type; 
    do 
    { 
     orderList.Insert(0, iteratingType); 
     iteratingType = iteratingType.BaseType; 
    } while (iteratingType != null); 

    var props = type.GetProperties() 
     .OrderBy(x => orderList.IndexOf(x.DeclaringType)) 
     .ToArray(); 

    return props; 
} 
+0

Я не вижу никаких проблем с этим, я не сравниваю 'DeclaringType' я получаю индексом и индексом. Попробуйте: –

+0

Я вижу, да, прекрасно работает. –

+1

но очень уродливый, к сожалению –

1

Я предпочитаю Linq решение на основе:

var baseProps = typeof(BaseDto).GetProperties(); 
var props = typeof(Client).GetProperties(); 

var allProps = baseProps 
    .Concat(props.Where(p => baseProps 
     .Select(b => b.Name) 
     .Contains(p.Name) == false)); 
+0

Обратите внимание, что это не будет работать для многоуровневого наследования .. Требуется больше работы и плохого выполнения также. –

+0

@SriramSakthivel согласен – Andrei

+0

Спасибо. В моем случае я использую многоуровневое наследование. –

0

Что о:

Dictionary<string, PropertyInfo> _PropertyIndex = new Dictionary<string, PropertyInfo>(); 

Type thisType = typeof(Client); 

foreach (PropertyInfo pi in thisType.BaseType.GetProperties()) 
    _PropertyIndex.Add(pi.Name.ToUpper(), pi); 
foreach (PropertyInfo pi in thisType.GetProperties()) 
    if(!_PropertyIndex.ContainsKey(pi.Name.ToUpper())) 
     _PropertyIndex.Add(pi.Name.ToUpper(), pi);