答え:いいえ、これはバグではありません。違いはReflectedTypeにあります。
したがって、ここでの本当の問題は次のとおりです。同じプロパティに対して、異なるタイプから反映された2 つのオブジェクトを比較しPropertyInfo
て、それが返される方法はありますtrue
か?
元の質問
このコードは、2 つの異なる方法を使用して、まったく同じプロパティPropertyInfo
に対して 2 つのオブジェクトを生成します。これらのプロパティ情報は、どういうわけか異なって比較されます。私はこれを理解しようとして時間を失いました。
私は何を間違っていますか?
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
namespace TestReflectionError
{
class Program
{
static void Main(string[] args)
{
Console.BufferWidth = 200;
Console.WindowWidth = 200;
Expression<Func<object>> expr = () => ((ClassA)null).ValueA;
PropertyInfo pi1 = (((expr as LambdaExpression)
.Body as UnaryExpression)
.Operand as MemberExpression)
.Member as PropertyInfo;
PropertyInfo pi2 = typeof(ClassB).GetProperties()
.Where(x => x.Name == "ValueA").Single();
Console.WriteLine("{0}, {1}, {2}, {3}, {4}", pi1, pi1.DeclaringType, pi1.MemberType, pi1.MetadataToken, pi1.Module);
Console.WriteLine("{0}, {1}, {2}, {3}, {4}", pi2, pi2.DeclaringType, pi2.MemberType, pi2.MetadataToken, pi2.Module);
// these two comparisons FAIL
Console.WriteLine("pi1 == pi2: {0}", pi1 == pi2);
Console.WriteLine("pi1.Equals(pi2): {0}", pi1.Equals(pi2));
// this comparison passes
Console.WriteLine("pi1.DeclaringType == pi2.DeclaringType: {0}", pi1.DeclaringType == pi2.DeclaringType);
Console.ReadKey();
}
}
class ClassA
{
public int ValueA { get; set; }
}
class ClassB : ClassA
{
}
}
ここでの出力は次のとおりです。
Int32 ValueA, TestReflectionError.ClassA, Property, 385875969, TestReflectionError.exe
Int32 ValueA, TestReflectionError.ClassA, Property, 385875969, TestReflectionError.exe
pi1 == pi2: False
pi1.Equals(pi2): False
pi1.DeclaringType == pi2.DeclaringType: True
犯人:PropertyInfo.ReflectedType
これら 2 つのオブジェクトの違いを発見しました... ReflectedType
. ドキュメントには次のように書かれています。
このメンバーを取得するために使用されたクラス オブジェクトを取得します。