2011-01-25 2 views
1
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 
} 

проблема в том, что я использую отражение для повторения класса пользователя, я не могу определить класс 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(); 
} 

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

С уважением, волей

+1

Там, кажется, что-то очень неправильно с подходом. Почему бы просто не реализовать «IComparable»? – leppie

ответ

3

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

if(!propertyInfo.PropertyType.IsValueType && propertyInfo.PropertyType != typeof(string)) 
{ 
    //you're dealing with a class 
} 
+0

это работа, отлично! Спасибо – willy

0

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

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 
} 

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

if (!propertyInfo.Name.Equals("CreatedDate") || 
!propertyInfo.Name.Equals("CreatedBy")) 
{ 
} 
+0

, вы должны задать новый вопрос. Но вы можете проверить свойство 'DeclaringType', чтобы узнать, был ли элемент наследован. –

+0

ok ben, я начну новый вопрос. спасибо за внимание – willy

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