System.Reflection GetNestetTypes Все поля объявлены Имя или значение
Как получить список всех полей во всех вложенных классах
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());
}
это вернет fieldInfo, а не имена или значения, и мне нужно больше как список строк или, лучше, словарь для полей-значений и имен, но список пока подойдет.
List<string> (or dictionary) ChosenContainersNamesOrValuesOfAllNested(Type T)
{
return a shortest syntax for that task, using lambda rather foreach
}
Благодарю.
1 ответ
Вы можете просто использовать Linq's 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));
}
Это работает, потому что статические поля не привязаны ни к какому экземпляру класса.