Odwołanie do obiektu którego definicja znajduje się w stringu

Odpowiedz Nowy wątek
2019-02-04 21:58
0

Cześć,

czy istnieje sposób aby użyć odwołania, którego definicja znajduje się w zmiennej ?

string [email protected]"kontrahent["Nazwa"].ToString()";
foreach (DataRow kontrahent in dsDane.Kontrahenci)
{
  Console.WriteLine(definicja);
}

Przedstawiony sposób nie działa. Na ekranie dostaję napis: kontrahent["Nazwa"].ToString() zamiast spodziewanej wartości Nazwa obiektu kontrahent.
pzdr

edytowany 2x, ostatnio: gtomczyk, 2019-02-04 22:15

Pozostało 580 znaków

2019-02-04 22:35
2

Dlaczego spodziewasz się takiej wartości, skoro deklarujesz zmienną o wartości @"kontrahent["Nazwa"].ToString()" i dokładnie ją wyświetlasz?

Lepiej napisz, co naprawdę chcesz osiągnąć, abyśmy uniknęli straty czasu na rozwiązywanie problemu XY.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2019-02-04 22:48
0

Jeśli dobrze się domyślam o co Ci chodzi (a z Twojego postu nie wiadomo o co) to masz jakieś obiekt podany jako JSON w stringu, i chcesz wyciągnąć wartość właściwości Nazwa z tego obiektu. W takim przypadku najprościej sparsowac ten obiekt, np. przy użyciu biblioteki Json.NET. Możesz za jej pomocą albo zdeserializowac obiekt na konkretny typ (np. Kontrahent) lub na JObject.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
edytowany 1x, ostatnio: Aventus, 2019-02-04 22:49
On tam ma DataSety, raczej daleko temu od JSONa. - somekind 2019-02-04 22:53
Mój błąd, przeczytałem pobieżnie. Usuwam się w cień :) - Aventus 2019-02-04 22:54

Pozostało 580 znaków

2019-02-04 22:55
0
somekind napisał(a):

Dlaczego spodziewasz się takiej wartości, skoro deklarujesz zmienną o wartości @"kontrahent["Nazwa"].ToString()" i dokładnie ją wyświetlasz?

Lepiej napisz, co naprawdę chcesz osiągnąć, abyśmy uniknęli straty czasu na rozwiązywanie problemu XY.

Już wyjaśniam,
szukam pomysłu na to aby zamiast deklarowanego w pętli odwołania do obiektu kontrahent:

Console.WriteLine(kontrahent["Nazwa"].ToString());

użyć takiej samej definicji przypisania ale pobranej ze zmiennej typu string.
To mi umożliwi utworzenie definicji zestawienia.
Kolejne wiersze definicji będę sobie zaczytywał do zmiennej i podstawiał w przebiegu pętli.
Nie wiem czy to jest wykonalne, podejrzewam że tak, tylko nie wiem jak to zapisać w pętli.

Poniższy fragment kodu:

foreach (DataRow kontrahent in dsDane.Kontrahenci)
{
  Console.WriteLine(kontrahent["Nazwa"].ToString());
}

chciałbym zastąpić kodem:

string [email protected]"kontrahent["Nazwa"].ToString()";
foreach (DataRow kontrahent in dsDane.Kontrahenci)
{
  Console.WriteLine(definicja);
}

Przyjmijmy że do zmiennej definicja została pobrana instrukcja z szablonu jakiegoś zestawienia.
Z góry dzięki za podpowiedź.

Pozostało 580 znaków

2019-02-04 22:57
0

No dobra, a czym ma być ta definicja zestawienia i czemu to musi być string?


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2019-02-04 23:10
0
somekind napisał(a):

No dobra, a czym ma być ta definicja zestawienia i czemu to musi być string?

W aplikacji którą mam na myśli generuję plik xml, w którym chcę umieścić dane pochodzące z tabeli Kontrahent.
Chciałbym w jednym z plików trzymać definicję odwołania do danych tak, aby w przypadku konieczności zmiany struktury generowanego pliku xml nie było konieczności modyfikowania kodu programu, a wystarczyła modyfikacja szablonu definiującego wybieranie danych.
Stąd zmienna typu string, do której założyłem że pobrano jedną z definicji występujących w pliku szablonu.

Pozostało 580 znaków

2019-02-04 23:12
1
var definicja = new Func<DataRow, string> (x => x["Nazwa"].ToString());

foreach (DataRow kontrahent in dsDane.Kontrahenci)
{
    Console.WriteLine(definicja(kontrahent));
}
edytowany 4x, ostatnio: WeiXiao, 2019-02-04 23:14
Bardzo dobrze, 3+. Pytający chce stringa. :P - somekind 2019-02-04 23:13
new Func<DataRow, string> (x => x["Nazwa"].ToString()); - to ma być zapisane w pliku tekstowym. - somekind 2019-02-04 23:14
No to Roslyn :D - WeiXiao 2019-02-04 23:15

Pozostało 580 znaków

2019-02-04 23:14
1

A to nie możesz w tej swojej definicji trzymać samych nazw kolumn, które i tak są stringami?


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2019-02-04 23:19
0

No dobra, a taki workaround, ale dość prosty:

Masz predefiniowaną listę delegatów Func<DataRow, T>, a z pliku wczytujesz tylko index tego, który ma być użyty?

edytowany 2x, ostatnio: WeiXiao, 2019-02-04 23:21
A co ja napisałem? :P I nawet nie trzeba żadnego Func, wystarczy odwoływać się po indeksie. - somekind 2019-02-04 23:21
@somekind: ale fanki pozwalają na upchnięcie bardziej skomplikowanej logiki, więc łatwiej będzie w przyszłości coś dodać/przerobić - WeiXiao 2019-02-04 23:23
Owszem. Dlatego w pierwszym poście spytałem, co dokładnie autor chce osiągnąć. Chyba już prawie odpowiedział... :) - somekind 2019-02-05 00:02

Pozostało 580 znaków

2019-02-04 23:35
0
somekind napisał(a):

A to nie możesz w tej swojej definicji trzymać samych nazw kolumn, które i tak są stringami?

Mógłbym, ale ograniczyłbym się wtedy tylko do nazw kolumn.
A jeżeli uda się zastosować podpięcie całej definicji to spodziewam się że mógłbym np. odwołać się do instrukcji warunkowej bądź wybrać część jakiejś wartości tekstowej.

edytowany 1x, ostatnio: gtomczyk, 2019-02-04 23:47

Pozostało 580 znaków

2019-02-04 23:40
0
WeiXiao napisał(a):
var definicja = new Func<DataRow, string> (x => x["Nazwa"].ToString());

foreach (DataRow kontrahent in dsDane.Kontrahenci)
{
    Console.WriteLine(definicja(kontrahent));
}

Dzięki WeiXiao,
spróbuję zastosować Twój pomysł w kodzie programiku i dam znać czy uzyskałem spodziewany rezultat.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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

Robot: CCBot