如何使用反射检测字段上的“new”修饰符?

5

http://msdn.microsoft.com/en-us/library/435f1dw2.aspx

public class Base
{
    public string Field;
}
public class Child : Base
{
    public new string Field;
}

[TestFixture]
public class TestClass
{

    [Test]
    public void DetectNew()
    {
        var fieldInfo = typeof(Child).GetField("Field");
        //How do I tell fieldInfo has a new modifier?
        Debug.WriteLine(fieldInfo);
    }
}

编辑:我知道可以使用“MethodBase.IsHideBySig”来检查方法和属性。为什么FieldInfo没有类似的属性?

2个回答

2

只是一个猜测,但我认为您需要搜索基类中是否有相同名称的成员。

您还可以查看两个字段的生成IL,以查看是否存在任何反射可用的差异。


这是我希望避免的方法。 - Simon
2
我查看了ILSpy的源代码,他们正在做同样的事情 - 遍历继承链。他们正在使用Mono.Cecil,但是没有通过反射无法获得的特殊信息。要获取更多信息,请查看ILSpy的AstBuilder.SetNewModifier方法。 - Igal Tabachnik

1

new 在这里的唯一作用是抑制编译器警告。

我猜它在生成的 IL 中不留下任何痕迹。

反问:你为什么感兴趣?只是好奇还是有实际场景需要使用?


“new” 关键字可以用来抑制编译器警告,但是对于方法和属性并非如此。您可以检查“MethodBase.IsHideBySig”。为什么字段与此不同呢? - Simon
“字段永远不能是虚拟的”是正确的。然而,我仍然感到惊讶的是,我可以为一个字段添加修饰符,并生成完全相同的IL代码。 - Simon
但没有警告。文档中提到了'意图'。我发现IsHideBySig/NewSlot的差异更令人惊讶。 - H H
至于为什么我想这样做...因此在XAML中,我可以绑定到字段并仍支持INotifyPropertyChanged。http://snipt.org/xltp - Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接