C# 如果我有两个对象和它们的类型,我怎样才能得到它们的值?

C# 如果我有两个对象和它们的类型,我怎样才能得到它们的值?,c#,reflection,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(originalV

我有以下代码:

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
    }
}
我使用的两个变量originalVals和newVals是Linq2Sql类。如果1有一个id为999的整型字段(整型字段),而另一个具有相同值的相同字段,则oldValue!=newValue比较将通过,因为它显然将使用引用相等

我想知道如何将oldValue和newValue转换为存储在dataType中的类型,例如:

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

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

对于对象,==和!=操作符只需检查引用是否相同:它们是否指向同一对象

您希望使用
.Equals()
方法检查值的等效性

if (!oldvalue.Equals(newvalue))
{
    //...
}

使用
if(!oldValue.Equals(newValue))
if(!Object.Equals(oldValue,newValue))
代替=

您可以检查他们是否实现了
IComparable
接口,并使用该接口进行比较

IComparable comparable = newValue as IComparable;
if(comparable.CompareTo(oldValue) != 0)
{
    //Do Stuff
}
尝试:

Convert.ChangeType(旧值,数据类型)


这应该将
oldValue
转换为
dataType

表示的类型,我认为您首先需要这样做

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

这将为您提供属性的数据类型。您得到的是PropertyInfo实例的类型。

是的,引用是不同的。我认为.Equals()也会检查引用相等性…?.Equals()在默认情况下会依赖引用相等性,这是不同的。虽然在这种情况下,您可能是对的,但实际情况就是这样。[继续]在这种情况下,您可能无法使用'MakeGenericType()'方法来构建EqualityComparer对象来进行比较。我认为对于您想要执行的数据类型。GetPropertyType()有人建议使用.PropertyType,那么应该是哪一个。如果(!Object.Equals(oldValue,newValue))似乎成功了,干杯!谢谢