linq выберите с помощью отражения

1

У меня есть класс вроде этого, класс 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 строк кода для его передачи. У меня есть ключевое слово "отражение", но я понятия не имею, как использовать его в моем коде. Любое предложение будет оценено по достоинству.

  • 3
    То, что вы хотите сделать с помощью рефлексии, здесь довольно сложно - сложная тема, потому что: вы работаете с дженериками (дженерики и рефлексия не очень хорошо играют), а б: в них участвуют деревья выражений LINQ или делегаты. В этом случае, 10 строк, вероятно, более приемлемый вариант ... Вы уверены, что хотите войти в это?
  • 0
    У меня есть много классов структуры сущностей. Я хочу вставить огромные данные в таблицу, я использую привязку данных Oracle. Поэтому я должен создать массив для каждого поля, чтобы установить значение OracleParameter.Value. таблица может иметь много полей 10,15. Я просто хочу упростить мой код
Теги:
linq
reflection

3 ответа

0
Лучший ответ

Вы можете запросить все свойства с отражением в виде списка и выбрать их из списка классов следующим образом:

Сначала вы получите 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();
  • 0
    Это сработало для меня, большое спасибо.
0

Это не так уж плохо, я не думаю:

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());
}
  • 0
    СвойствоInfo.GetValue () хотя бы имеет два параметра?
  • 0
    Вам не нужно два параметра ... Этот код компилируется и работает для меня, .Net 4.5
Показать ещё 1 комментарий
0

Это должно работать для всех свойств строки:

        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());
        }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню