我看到了基于CLR的两种不同的行为,我的应用程序是在CLR下运行的。在一种情况下,它返回封闭类型的抽象属性,而在另一种情况下,则不返回抽象属性。由于属性是抽象的,所以感觉第一个属性更像是正确的。
我在VS2010下针对.NET 3.5 SP1编译了以下内容,然后将物理可执行文件复制到另一台具有不同CLR小版本的计算机上进行了测试:
public abstract class BaseEntity<TId>
{
public abstract TId PK { get; set; }
}
public class DerivedEntity : BaseEntity<int>
{
public override int PK { get; set; }
}
class Program
{
static void Main(string[] args)
{
var derivedEntity = new DerivedEntity();
var type = derivedEntity.GetType();
var flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty;
foreach (var memberInfo in type.GetMember("PK", flags))
{
Console.WriteLine(
"Member: " + memberInfo.Name
+ " from " + memberInfo.DeclaringType);
}
Console.WriteLine("Running : " + Environment.Version);
Console.WriteLine("mscorlib: " + typeof(int).Assembly.GetName().Version);
}
}在运行2.0.50727.4952的机器上,我看到以下输出:
Member: PK from MemberInfoTest.DerivedEntity
Running : 2.0.50727.4952
mscorlib: 2.0.0.0在运行2.0.50727.3615的机器上,我得到了不同的输出:
Member: PK from MemberInfoTest.DerivedEntity
Member: PK from MemberInfoTest.BaseEntity`1[System.Int32]
Running : 2.0.50727.3615
mscorlib: 2.0.0.0在不同的情况下,上述差异会导致AmbiguousMatchException。这些行为中哪一种是正确的,另一种行为是否有“修复”?
编辑:我刚刚测试了针对CLR-4运行时的,在这两种情况下都没有返回抽象的封闭属性,这进一步表明第一种行为是正确的。
发布于 2011-02-02 23:04:14
我不知道为什么会发生这种行为。我猜您看到的是RTM和SP1 CLR,反射在这两个版本之间有一个细微的差别/错误。
您可以通过声明PK成员来解决此问题,该成员是通过设置GetMembers对特定类型进行BindingFlags.DeclaredOnly声明的。DeclaredOnly将返回成员限制为仅在特定类型上声明的成员。它将筛选出在父类型上声明的任何成员。
https://stackoverflow.com/questions/4880948
复制相似问题