可能重复:
我如何检测";新的";使用反射对场进行修改?
具有以下声明
public class B : A
{
public new string Name;
}
如何确定字段的FieldInfo
实例是否具有"new"修饰符?
对于字段,不存在这样的字段;IL很简单:
.field public string Name
etc-因为没有虚拟字段或newslot等的概念。这里的new
修饰符存在于编译器的中,让你断言你承认你在做一些有点令人困惑的事情。在此处添加new
将抑制编译器警告(CS0108(,但不会更改IL。因此,您无法区分正式new
d字段与未使用new
而隐藏的字段。
不过,如果您将自己限制为具有公共访问器属性的私有字段,则会更可取。请注意,在任何一种情况下:基本类型中的字段仍然存在。
我认为您需要在基类层次结构中搜索具有相同名称的成员,如果不是,则它是新的。
我知道它很丑陋,但根据对同一问题的另一个答案的评论,我如何检测";新的";使用反射对场进行修改?,上面写着:
我看了ILSpy的源代码,他们也在做同样的事情-在继承链上行走。他们在用Mono。Cecil,但有没有通过反射无法获得的特殊信息。了解更多信息请参阅ILSpy的
AstBuilder.SetNewModifier
方法。
可能不是你所期望的,很抱歉。