使用GetFields()通过继承获取重复的字段

时间:2017-10-17 08:20:10

标签: c# .net reflection

我在尝试从用户定义的类中获取所有字段时使用GetFields()方法时遇到问题。

我有一个父类,让我们说两个公共字段,另一个继承自父类的类,并使用new关键字覆盖其中一个父字段。

当我对第二个类使用GetFields方法时出现问题,因为它返回所有字段,包括覆盖字段。是否存在我做错的事情或只是在这种情况下从Parent类中获取GoodBye字段并且只有一个Hello字段(来自继承类的字段)的解决方案?

这是我所说的一个简单例子:

    public class Foo
    {
        public string Hello = "sdfsafda";

        public string GoodBye = string.Empty;
    }


    public class Bar : Foo
    {
        public new string Hello = "jl";
    }


    static void Main(string[] args)
    {

        var a = new Bar();



        var derp = new List<string>();

        foreach (var fieldInfo in a.GetType().GetFields())
        {

            derp.Add(fieldInfo.Name);

        }

        Console.WriteLine(derp.Count);
        // writes 3 instead of 2

    }

关于使用“属性”而不是“字段”,我恐怕现在无法使用它们,因为我正在处理的项目中无法解决的限制。

1 个答案:

答案 0 :(得分:0)

似乎没有预先收集的有关可用阴影字段的信息。如果您只需要一个简单的解决方法,您可以先获取所有字段的名称而不重复,然后使用GetField(fieldName)仅获取派生最多的字段实例:

var type = a.GetType();
foreach (var field1 in type.GetFields().Select(x => x.Name).Distinct())
{
    var fieldInfo = type.GetField(field1);
    derp.Add(fieldInfo.Name);
    Console.WriteLine(fieldInfo.DeclaringType);
    Console.WriteLine(fieldInfo);
}

当然,如果您只需要问题代码中的字段名称,而不是FieldInfo对象,则可以在.Select(x => x.Name).Distinct()之后停止。