如果我有2个对象对象及其类型我怎样才能得到它们的值?

时间:2009-10-28 16:32:50

标签: c# reflection

我有以下代码:

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;

但这不起作用。有什么建议吗?

5 个答案:

答案 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实例的类型。