Вопрос:
Я пытаюсь создать общий метод для моего поиска, но я не знаю, как вернуть список полей из моего класса.
Скажем, у меня есть класс:
public class Table { [Key] public int ID { get; set; } public string Name { get; set; } public string Address { get; set; } }
И теперь я хочу вернуть список, который будет выглядеть следующим образом:
«ID» «Name» «Address»
Как мне это сделать?
попробовал что-то вроде этого:
FieldInfo[] fields = typeof(T).GetFields( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); string[] names = Array.ConvertAll<FieldInfo, string>(fields, delegate(FieldInfo field) { return field.Name; });
Но у него есть лишний текст после имен полей
РЕДАКТИРОВАТЬ
Это не дублируется, потому что в моей ситуации GetProperties(). Выбор (f => f.Name) сделал разницу
Лучший ответ:
Вы можете сделать это с отражением:
var listOfFieldNames = typeof(Table).GetProperties().Select(f => f.Name).ToList();
Обратите внимание, что вам явно нужны свойства, а не поля. Термин “поля” относится к частным (экземплярам) членам. Публичные геттеры/сеттеры называются свойствами.
Ответ №1
Вы хотите использовать то, что известно как отражение. Вы можете получить массив объектов PropertyInfo следующим образом:
PropertyInfo[] properties = typeof(Table).GetType().GetProperties();
Класс PropertyInfo содержит информацию о каждом свойстве в классе, включая их имена (что вас интересует). Есть много и много других вещей, которые вы можете сделать с отражением, но это, безусловно, один из самых распространенных.
EDIT: изменил мой ответ, чтобы не требовать экземпляр Table.
Ответ №2
Вы можете написать функцию полезности, которая получает имена свойств в данном классе:
static string[] GetPropertyNames<T>() => typeof(T) .GetProperties() .Select(prop => prop.Name) .ToArray();
Кроме того, вы можете предоставить метод расширения в классе Type, а затем оснастить его самой этой функцией:
static class TypeExtensions { public static string[] GetPropertyNames(this Type type) => type .GetProperties() .Select(prop => prop.Name) .ToArray(); } … foreach (string prop in typeof(Table).GetPropertyNames()) Console.WriteLine(prop);
Этот код печатает три имени свойств типа таблицы:
ID Name Address