Bawiłem się trochę js-em i interesuje mnie czy w C# istnieje coś podobnego do window
Nie, C# to nie jest język interpretowany przez przeglądarkę, więc nie ma sensu, aby istniał w nim jakiś globalny obiekt okna przeglądarki.
oraz eval
C# to język kompilowany, więc nie można tak po prostu wywołać interpretacji danego stringa jako kodu źródłowego. Ale można skompilować kod dynamicznie w locie i go wywołać, np. tak jak tutaj
W JavaScript wyglądało to tak
window
// Zmieniamy wartość
window["a"+2] = 40;
Tego też nie zrobisz, bo C# jest statycznie typowany i nie można sobie tak po prostu rozszerzać obiektów o nowe właściwości w locie. Tzn. jest nawet dostępny typ dynamic
, który zachowuje się jak typy dynamiczne w innych językach (można go np. rozszerzać), ale i tak jest statycznie typowany.
Mój problem w c# wygląda tak że mam listę w klasie. Ale chcę w niej trzymać tak jak by nazwy zmiennych z innej klasy i móc je zmienić w trakcie wykonywania pętli foreach.
Ale czemu chcesz tak robić? Bo tak się robiło w JS?
A czemu nie mieć np. kolekcji wyrażeń przypisujących właściwości, np. tak:
var properties = new Action<Person, string>[] { (p, v) => p.FirstName = v, (p, v) => p.LastName = v };
var person = new Person();
foreach (var prop in properties)
{
prop.Invoke(person, "abc");
}
Console.WriteLine($"{person.FirstName} {person.LastName}");
Można też zamiast mieć kolekcję właściwości zamiast kolekcji przypisań, tylko wtedy trzeba przypisania dokonać "ręcznie" za pomocą refleksji:
var propertyExpressions = new Expression<Func<Person, string>>[] { p => p.FirstName, p => p.LastName };
foreach (var expr in propertyExpressions)
{
var memberExpression = (MemberExpression)expr.Body;
var property = (PropertyInfo)memberExpression.Member;
var setMethod = property.GetSetMethod();
setMethod.Invoke(person, new[] { "ghi" });
}
Console.WriteLine($"{person.FirstName} {person.LastName}");
Ogólnie można cudować na różne sposoby, tylko niekoniecznie jest sens. Napisz, jaki masz faktyczny problem, bo to, że coś się rozwiązuje w jakiś sposób w jednym języku nie znaczy, że we wszystkich innych będzie tak samo.