сравнить класс с помощью отражения - PullRequest
1 голос
/ 25 января 2011
public class User
{
   private string _username;
   private string _password;
   private Employee _employee;

   //set get 
}

public class Employee
{
   private int _id;
   private string _firstname;
   private string _lastname;

   //set get
}

проблема в том, что когда я использую отражение для итерации класса User, я не могу определить класс Employee. мой код такой

public string Compare<T>(T newVal, T oldVal)
{
   StringBuilder retVal = new StringBuilder();

   Type objectsType = typeof(T);

   foreach (PropertyInfo propertyInfo in objectsType.GetProperties(
                    BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance))
   {
      //if (?) --> how to identify the propertyInfo here as class so that i can iterate using recursive
      //{
      //    Compare(propertyInfo.GetValue(oldVal, null), propertyInfo.GetValue(newVal, null));
      //}

      if (propertyInfo.CanRead)
      {
         object newValue = propertyInfo.GetValue(newVal, null);
         object oldValue = propertyInfo.GetValue(oldVal, null);

         if (propertyInfo.PropertyType.Namespace.StartsWith("System") && !propertyInfo.PropertyType.IsGenericType)
         {
            if (!Object.Equals(newValue, oldValue))
            {
               retVal.Append(propertyInfo.Name + " = " + newValue.ToString() + ";");
            }
         }
      }
   }

   return retVal.ToString();
}

пожалуйста, помогите, спасибо

С уважением, Willy

Ответы [ 2 ]

3 голосов
/ 25 января 2011

Вы можете сделать что-то вроде этого:

if(!propertyInfo.PropertyType.IsValueType && propertyInfo.PropertyType != typeof(string))
{
   //you're dealing with a class
}
0 голосов
/ 26 января 2011

Как насчет того, чтобы выбрать только некоторые свойства, которые можно сравнить.допустим, я изменяю класс пользователя

public class BaseEntity
{
   private string _createdBy;
   private DateTime _createdDate;
   private string _updatedBy;
   private DateTime _updatedDate;
}

public class User : BaseEntity
{
   private string _username;
   private string _password;
   private Employee _employee;

   //set get 
}

Я хочу сравнить только имя пользователя, пароль и сотрудника, а не созданный пользователем и созданный пользователем.Есть какой-либо способ сделать это?Я попытался выполнить поиск по Google, но ничего не нашел, поэтому могу только жестко закодировать его, как это

if (!propertyInfo.Name.Equals("CreatedDate") ||
!propertyInfo.Name.Equals("CreatedBy"))
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...