首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetMember是否应该返回封闭类型上的抽象属性?

GetMember是否应该返回封闭类型上的抽象属性?
EN

Stack Overflow用户
提问于 2011-02-02 23:00:35
回答 1查看 249关注 0票数 2

我看到了基于CLR的两种不同的行为,我的应用程序是在CLR下运行的。在一种情况下,它返回封闭类型的抽象属性,而在另一种情况下,则不返回抽象属性。由于属性是抽象的,所以感觉第一个属性更像是正确的。

我在VS2010下针对.NET 3.5 SP1编译了以下内容,然后将物理可执行文件复制到另一台具有不同CLR小版本的计算机上进行了测试:

代码语言:javascript
复制
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的机器上,我看到以下输出:

代码语言:javascript
复制
Member: PK from MemberInfoTest.DerivedEntity
Running : 2.0.50727.4952
mscorlib:   2.0.0.0

在运行2.0.50727.3615的机器上,我得到了不同的输出:

代码语言:javascript
复制
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运行时的,在这两种情况下都没有返回抽象的封闭属性,这进一步表明第一种行为是正确的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-02 23:04:14

我不知道为什么会发生这种行为。我猜您看到的是RTM和SP1 CLR,反射在这两个版本之间有一个细微的差别/错误。

您可以通过声明PK成员来解决此问题,该成员是通过设置GetMembers对特定类型进行BindingFlags.DeclaredOnly声明的。DeclaredOnly将返回成员限制为仅在特定类型上声明的成员。它将筛选出在父类型上声明的任何成员。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4880948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档