0


0

次のようなコードがあります。

タイプtype = typeof(T);

foreach(PropertyInfo pi in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)){Type dataType = type.GetProperty(pi.Name).GetType();オブジェクトoldValue = type.GetProperty(pi.Name).GetValue(originalVals、null);オブジェクトnewValue = type.GetProperty(pi.Name).GetValue(newVals、null);

if(oldValue!= newValue){//何かをする}}

私が使っている2つの変数originalValsとnewValsはLinq2Sqlクラスです。 1が999のidを持つintフィールド(intField)を持ち、他が同じ値を持つ同じフィールドを持つ場合、oldValue!= newValue比較は、明らかに参照等価を使用するため、合格となります。

dataTypeに格納されているTypeとしてoldValueとnewValueをキャストする方法を知りたいのですが、以下のようにします。

((typeof(dataType)oldValue);または(dataType)oldValue;

しかしこれはうまくいきません。 助言がありますか?

5 Answer


2


オブジェクトの場合、==と!=演算子は_references_が同じかどうかを確認するだけです。それらは同じオブジェクトを指しているのでしょうか。

値の等価性をチェックするには `.Equals()`メソッドを使いたいです。

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


0


!=の代わりに `if(!oldValue.Equals(newValue))`または `if(!Object.Equals(oldValue、newValue))`を使用してください。


0


あなたはそれらが `IComparable`インターフェースを実装しているかどうかをチェックし、それを使って比較をすることができます。

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


0


Try:

Convert.ChangeType(oldValue、dataType)

これは oldValue`を dataType`で表される型にキャストするべきです。


0


まず最初にこれをする必要があると思います

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

これにより、プロパティのデータの種類がわかります。 持っているのは、PropertyInfoのインスタンスの型を取得することです。