2013-04-15 2 views
0

Я хочу, чтобы выяснить недостающие свойства в одном классе, сравнивая другой классКак я могу сравнить два класса, основанные на их методах?

public class User 
{ 
    public int UserID { get; set; } 
    public string UserName { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class UserDTO 
{ 

    public string UserName { get; set; } 
    public string FirstName { get; set; } 

} 

Выше я должен получить на выходе, как «USERID„“свойства LastName отсутствуют в UserDTO.

+1

Почему бы это не выход 'UserID', как отсутствует, тоже? –

+2

В чем проблема, с которой вы сталкиваетесь? Это тривиально. – leppie

+0

Да, вопрос обновлен. –

ответ

7

Использование отражения чтобы получить свойства, см Type.GetProperties. Затем сравните оба списка свойств, чтобы найти недостающие.

var UserProperties = typeof(User).GetProperties().Select(p => p.Name); 
var UserDTOProperties = typeof(UserDTO).GetProperties().Select(p => p.Name); 

var missingProperties = UserProperties.Except(UserDTOProperties); 

Примите во внимание, что все наследуемые свойства также не будут присутствовать в этих списках, если у ous укажите BindingFlags.DeclaredOnly методу GetProperties(), см. BindingFlags.

10
var list = typeof(User).GetProperties().Select(x => x.Name) 
      .Except(typeof(UserDTO).GetProperties().Select(y => y.Name)) 
      .ToList(); 

EDIT

В том числе предложения в комментариях и общественной Fields

public static IEnumerable<string> Diff(Type t1, Type t2) 
{ 
    return t1.GetProperties().Select(p1 => new { Name = p1.Name, Type = p1.PropertyType }) 
      .Concat(t1.GetFields().Select(f1 => new { Name = f1.Name, Type = f1.FieldType })) 
      .Except(t2.GetProperties().Select(p2 => new { Name = p2.Name, Type = p2.PropertyType }) 
        .Concat(t2.GetFields().Select(f2 => new { Name = f2.Name, Type = f2.FieldType }))) 
      .Select(a => a.Name); 
} 
+0

Это приятное решение +1. –

+0

+1. Вы можете даже содержать его в универсальном методе, например 'IEnumerable GetDiff ()', если есть необходимость в его повторном использовании :) –

+1

Я бы добавил тип '.Select (p => new {Name = p.Name, Type = p.PropertyType}); '. Тогда вы поймете, будут ли свойства иметь одно и то же имя, но разные типы. –

Смежные вопросы