Powiel możliwe:
Finding the Variable Name passed to a Function in C#Jak uzyskać nazwę zmiennej, która została fizycznie wpisana w deklaracji?
Poniższa klasa zawiera Citi Field.
Potrzebuję dynamicznie określać nazwę pola, ponieważ jest wpisana w deklaracji klasy , tj. Muszę uzyskać ciąg "miasto" z instancji obiektu miasta.
Próbowałem to zrobić, sprawdzając jego typ DoSomething(), ale nie można go znaleźć podczas sprawdzania zawartości typu w debugerze.
Czy to możliwe?
public class Person
{
public string city = "New York";
public Person()
{
}
public void DoSomething()
{
Type t = city.GetType();
string field_name = t.SomeUnkownFunction();
//would return the string "city" if it existed!
}
}
Niektórzy ludzie w swoich odpowiedziach poniżej pytali mnie, dlaczego chcę to zrobić. Oto dlaczego.
W mojej prawdziwej sytuacji na świecie istnieje niestandardowy atrybut nad miastem.
[MyCustomAttribute("param1", "param2", etc)]
public string city = "New York";
Potrzebuję tego atrybutu w innym kodzie. Aby uzyskać atrybut, używam odbicia. I w kodzie refleksji muszę wpisać ciąg „miasto”
MyCustomAttribute attr;
Type t = typeof(Person);
foreach (FieldInfo field in t.GetFields())
{
if (field.Name == "city")
{
//do stuff when we find the field that has the attribute we need
}
}
Teraz to nie jest typ bezpieczne. Gdybym zmienił zmiennej „miasto” na „workCity” w moim oświadczeniu pola osobiście linia ta nie powiedzie się, chyba że wiedział zaktualizować ciąg
if (field.Name == "workCity")
//I have to make this change in another file for this to still work, yuk!
{
}
Więc staram się znaleźć jakiś sposób, aby przekazać ciąg do ten kod bez fizycznego wpisywania go.
Tak, mógłbym zadeklarować to jako stałą łańcuchową w Person (lub coś w tym stylu), ale to nadal byłoby wpisywanie jej dwukrotnie.
Uff! Trudno to wyjaśnić!
Dzięki
Dziękujemy wszystkim, którzy odpowiedzieli na to * dużo *. To wysłało mnie na nową ścieżkę, aby lepiej zrozumieć wyrażenia lambda. I stworzył nowe pytanie.
wysiąść, mam edytowane moją odpowiedź, a teraz niestety muszę iść do łóżka, a więc jesteś na własną rękę, stąd na zewnątrz. –
W C# 6.0 i nowszych wersjach można użyć funkcji 'nameof', aby uzyskać numer , np." Nameof (miasto) "zwróci" miasto " –