Если у меня есть 2 объекта и их Тип, как я могу получить их значение? - PullRequest
0 голосов
/ 28 октября 2009

У меня есть следующий код:

Type type = typeof(T);

foreach (PropertyInfo pi in type.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
    Type dataType = type.GetProperty(pi.Name).GetType();
    object oldValue = type.GetProperty(pi.Name).GetValue(originalVals, null);
    object newValue = type.GetProperty(pi.Name).GetValue(newVals, null);

    if (oldValue != newValue)
    {
        // Do Something
    }
}

2 переменные originalVals и newVals, которые я использую, являются классами Linq2Sql. Если 1 имеет поле int (intField) с идентификатором 999, а другое имеет то же поле с тем же значением, то сравнение oldValue! = NewValue пройдет, потому что оно, очевидно, будет использовать равенство ссылок.

Я хотел бы знать, как преобразовывать oldValue и newValue в тип, хранящийся в dataType, что-то вроде:

((typeof(dataType)oldValue); or
(dataType)oldValue;

но это не работает. Есть предложения?

Ответы [ 5 ]

2 голосов
/ 28 октября 2009

Для объектов операторы == и! = Просто проверяют, совпадают ли ссылки : указывают ли они на один и тот же объект?

Вы хотите использовать метод .Equals() для проверки эквивалентности значений.

if (!oldvalue.Equals(newvalue))
{
    //...
}
0 голосов
/ 28 октября 2009

Я думаю, вам нужно сделать это в первую очередь

Type dataType = type.GetProperty(pi.Name).PropertyType;

Это даст вам тип данных для свойства. У вас есть тип для экземпляра PropertyInfo.

0 голосов
/ 28 октября 2009

Попробуйте:

Convert.ChangeType(oldValue, dataType)

Это должно привести oldValue к типу, представленному dataType.

0 голосов
/ 28 октября 2009

Вы можете проверить, реализуют ли они интерфейс IComparable, и использовать его для сравнения.

IComparable comparable = newValue as IComparable;
if(comparable.CompareTo(oldValue) != 0)
{
    //Do Stuff
}
0 голосов
/ 28 октября 2009

используйте if(!oldValue.Equals(newValue)) или if(!Object.Equals(oldValue, newValue)) вместо! =

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...