Odczytanie pola klasy po nazwie

0

Witam,
mam listę obiektów klasy Foo:

public class Foo
{
    public string name1;
    public string name2;
    public string mail;
}

List<Foo> records;

foreach (var rec in records)
{
    var fieldValues = rec.GetType().GetFields().Select(field => field.GetValue(rec)).ToList();
}

W pętli pobieram wszystkie wartości jednego rekordu danych.
Pytanie jak pobrać wartość konkretnej zmiennej, np. "name2"?

Pozdrawiam.

4

A czemu chcesz się odnieść do pola po nazwie? Nie lepiej zrobić mapę z kluczami string?

1

name2 nie jest zmienną a polem -> uzyj Mapy zwanej w C# Dictionary

0
var fieldValues = records.Select(field => field.name2).ToList();
0
_13th_Dragon napisał(a):
var fieldValues = records.Select(field => field.name2).ToList();

A co w przypadku kiedy zamiast:

List<Foo> records;

Mam typ generyczny:

List<T> records

Wtedy to rozwiązanie nie zadziała.

1
Janko M. napisał(a):
_13th_Dragon napisał(a):
var fieldValues = records.Select(field => field.name2).ToList();

A co w przypadku kiedy zamiast:

List<Foo> records;

Mam typ generyczny:

List<T> records

Wtedy to rozwiązanie nie zadziała.

Może opisz dokładniej co próbujesz zrobić? Większy big picture.

1
Janko M. napisał(a):

Mam typ generyczny:

List<T> records

Wtedy to rozwiązanie nie zadziała.

            foreach (var rec in records)
            {
                var fields=rec
                    .GetType()
                    .GetFields()
                    .Where(field => field.IsPublic)
                    .Select(field => new { name = field.Name, value = field.GetValue(rec).ToString() })
                    .ToList()
                ;
                foreach(var value in fields) Console.WriteLine(value.name+": "+value.value);
                Console.WriteLine();
            }

Z tym że nie tędy droga, obstawiałbym że nie wiesz co czynisz.

0

Mam tak:

List<Foo> testRecords = new List<Foo>();
testRecords.Add(...);
testRecords.Add(...);

ReadData(testRecords.Cast<object>().ToList());

public void ReadData<T>(List<T> records)
{
	foreach (var rec in records)
	{
		var fieldValues = rec.GetType().GetFields().Select(field => field.GetValue(rec)).ToList();
	}
}

W metodzie ReadData() chcę odczytać wartość pola name2, to wszystko.

0
Janko M. napisał(a):

Mam tak:

List<Foo> testRecords = new List<Foo>();
testRecords.Add(...);
testRecords.Add(...);

ReadData(testRecords.Cast<object>().ToList());

public void ReadData<T>(List<T> records)
{
	foreach (var rec in records)
	{
		var fieldValues = rec.GetType().GetFields().Select(field => field.GetValue(rec)).ToList();
	}
}

W metodzie ReadData() chcę odczytać wartość pola name2, to wszystko.

A co masz w tych?

testRecords.Add(...);
testRecords.Add(...);

Bo tam inicjujesz swoje Foo, więc pewnie wkładasz do nich to co chcesz wyciągnąć z name2.

0
Riddle napisał(a):

Bo tam inicjujesz swoje Foo, więc pewnie wkładasz do nich to co chcesz wyciągnąć z name2.

Tak, ale muszę to zrobić w metodzie

ReadData()

1 użytkowników online, w tym zalogowanych: 0, gości: 1