У меня есть класс вроде этого, класс List, список списка строк
class Test
{
public string AAA{ get; set; }
public string BBB{ get; set; }
}
List<Test> test;
List<List<string>> output;
Я хочу вывести контент из теста на выход. Теперь я использую linq, чтобы передать его, как показано ниже.
output[0] = test.Select(x=>x.AAA).ToList();
output[1] = test.Select(x=>x.BBB).ToList();
Если этот класс имеет 10 свойств, я должен написать 10 строк кода для его передачи. У меня есть ключевое слово "отражение", но я понятия не имею, как использовать его в моем коде. Любое предложение будет оценено по достоинству.
Вы можете запросить все свойства с отражением в виде списка и выбрать их из списка классов следующим образом:
Сначала вы получите 1 список для каждого класса со списком свойств и значения
var first = test.Select(t => t.GetType().GetProperties().ToList().Select(p => p.GetValue(t, null).ToString()).ToList()).ToList();
это даст вам 1 список за свойство со списком значения свойства класса
var second typeof(Test).GetProperties().Select(p => test.Select(t => p.GetValue(t, null).ToString()).ToList()).ToList();
Это не так уж плохо, я не думаю:
var allObjects = new List<Test>();
var output = new List<List<string>>();
//Get all the properties off the type
var properties = typeof(Test).GetProperties();
//Maybe you want to order the properties by name?
foreach (var property in properties)
{
//Get the value for each, against each object
output.Add(allObjects.Select(o => property.GetValue(o) as string).ToList());
}
Это должно работать для всех свойств строки:
List<List<string>> output = new List<List<string>>();
foreach(var property in typeof(Test).GetProperties(
BindingFlags.Public | BindingFlags.Instance))
{
if (property.PropertyType != typeof(string)) continue;
var getter = (Func<Test, string>)Delegate.CreateDelegate(
typeof(Func<Test, string>), property.GetGetMethod());
output.Add(test.Select(getter).ToList());
}