我在尝试从用户定义的类中获取所有字段时使用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
}
关于使用“属性”而不是“字段”,我恐怕现在无法使用它们,因为我正在处理的项目中无法解决的限制。
答案 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()
之后停止。