如何通过反射确定某个字段是否有“新”修饰符?

时间:2011-08-31 12:11:15

标签: c# reflection

  

可能重复:
  How do I detect the "new" modifer on a field using reflection?

有以下声明

public class B : A
{
    public new string Name;
}

如何确定该字段的FieldInfo实例是否具有“新”修饰符?

2 个答案:

答案 0 :(得分:10)

对于字段,不存在这样的字段; IL简直就是:

.field public string Name

等 - 因为没有虚拟字段或新闻节点的概念等。new修饰符在这里为编译器存在纯粹,因为你断言你确认new将禁止编译器警告(CS0108),但不会更改IL 。因此,您无法区分正式 new d字段与不使用new隐藏的字段。

但是,如果您将自己限制在具有公共访问者属性的私有字段中,那将更为可取。请注意,在任何一种情况下:基本类型中的字段仍然存在

答案 1 :(得分:5)

我认为您需要在基类层次结构中搜索具有相同名称的成员,如果不是,那么它就是新的。

我知道这很难看,但根据对同一问题How do I detect the "new" modifer on a field using reflection?的其他答案的评论,它说:

  

我看了一下ILSpy的源代码,他们正在做同样的事情 -   走继承链。他们正在使用Mono.Cecil,但有   没有通过反射无法获得的特殊信息。更多   信息,请查看ILSpy的AstBuilder.SetNewModifier方法。

可能不是你所期待的,对不起。