我有以下代码:
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有一个id为999的int字段(intField)而另一个具有相同值的相同字段,则oldValue!= newValue比较将会通过,因为它显然会使用引用相等。
我想知道如何将oldValue和newValue转换为存储在dataType中的Type,如:
((typeof(dataType)oldValue); or
(dataType)oldValue;
但这不起作用。有什么建议吗?
答案 0 :(得分:2)
对于对象,==和!=运算符只检查引用是否相同:它们是否指向同一个对象?
您希望使用.Equals()
方法检查值等价。
if (!oldvalue.Equals(newvalue))
{
//...
}
答案 1 :(得分:0)
使用if(!oldValue.Equals(newValue))
或if(!Object.Equals(oldValue, newValue))
代替!=
答案 2 :(得分:0)
您可以检查他们是否实现了IComparable
界面并使用它来进行比较。
IComparable comparable = newValue as IComparable;
if(comparable.CompareTo(oldValue) != 0)
{
//Do Stuff
}
答案 3 :(得分:0)
尝试:
Convert.ChangeType(oldValue, dataType)
这会将oldValue
强制转换为dataType
所代表的类型。
答案 4 :(得分:0)
我认为首先需要这样做
Type dataType = type.GetProperty(pi.Name).PropertyType;
这将为您提供该属性的数据类型。你得到的是为你提供PropertyInfo实例的类型。