系统.反射GetNestetTypes所有声明的字段名称或值

本文关键字:字段 声明 反射 GetNestetTypes 系统 | 更新日期: 2023-09-27 18:17:37

如何获得所有嵌套类中所有字段的列表

class AirCraft
{
    class fighterJets
    {
        public string forSeas = "fj_f18";
        public string ForLand = "fj_f15";
    }
    class helicopters 
    {
        public string openFields = "Apachi";
        public string CloseCombat = "Cobra";
    }
}

我试图使用的代码来自这里的一个帖子我可以把它分成两到三行独立的代码,它就可以工作了这个问题是关于表达式的,并且使用最短/现代的代码。

IEnumerable<FieldInfo> GetAllFields(Type type) {
    return type.GetNestedTypes().SelectMany(GetAllFields)
               .Concat(type.GetFields());
}

this将返回fieldInfo而不是名称或值,我更需要它作为字符串列表,或者更好的是作为字段值和名称的字典但是现在一个列表就可以了。

List<string> (or dictionary) ChosenContainersNamesOrValuesOfAllNested(Type T)
{
   return a shortest syntax for that task, using lambda rather foreach
}

谢谢。

系统.反射GetNestetTypes所有声明的字段名称或值

您可以使用Linq的Select扩展方法来获取名称:

IEnumerable<string> GetAllFieldNames(Type type)
{
    // uses your existing method
    return GetAllFields(type).Select(f => f.Name);
}

ToDictionary扩展方法构造字典:

IDictionary<string, object> GetAllFieldNamesAndValues(object instance) 
{
    return instance.GetType()
        .GetFields()
        .ToDictionary(f => f.Name, f => f.GetValue(instance));
}

注意,您需要一个该类型的实例来获取值。而且,这只适用于单个类型,因为您需要每种类型的一个实例来获取值。

但是,如果您将字段定义为静态,则可以这样做:

class AirCraft
{
    public class fighterJets
    {
        public static string forSeas = "fj_f18";
        public static string ForLand = "fj_f15";
    }
    public class helicopters 
    {
        public static string openFields = "Apachi";
        public static string CloseCombat = "Cobra";
    }
}
IEnumerable<FieldInfo> GetAllStaticFields(Type type) 
{
    return type.GetNestedTypes().SelectMany(GetAllFields)
               .Concat(type.GetFields(BindingFlags.Public | BindingFlags.Static));
}

IDictionary<string, object> GetAllStaticFieldNamesAndValues(Type type) 
{
    return GetAllStaticFields(type)
        .ToDictionary(f => f.Name, f => f.GetValue(null));
}

这是有效的,因为静态字段不绑定到类的任何实例。