Próbuję uzyskać dostęp do obiektu przechowywanego w słowniku typu String, UnknownClass. Mam klucz i wiem, że wartość jest jedną z kilku klas kontenera. Ponieważ wartość jest przekazywana do metody, która pobiera obiekt, nie potrzebuję znać typu klasy przechowywanej jako wartość. Muszę również wywołać ContainsKey, aby potwierdzić, że klucz istnieje.Uzyskaj wartość słownika za pomocą refleksji
Próbowałem następujące metody bez powodzenia:
Dictionary<String, object> list = (Dictionary<String, object>)source.GetType().GetProperty(dictionaryName).GetValue(source, null);
nextSource = list[key];
co daje mi błąd odlewniczej oraz:
nextSource = source.GetType().GetMethod("get_Item").Invoke(source, new object[] { key });
co daje mi wyjątku null odniesienia.
Tutaj jest trochę więcej kodu, chociaż nie jestem całkiem pewien, czy to pomoże.
private void SetValue(object source, String path, String value)
{
if (path.Contains('.'))
{
// If this is not the ending Property, continue recursing
int index = path.IndexOf('.');
String property = path.Substring(0, index);
object nextSource;
if(property.Contains("*"))
{
path = path.Substring(index + 1);
index = path.IndexOf('.');
String dictionaryName = path.Substring(0, index);
Dictionary<String, object> list = (Dictionary<String, object>)source.GetType().GetProperty(dictionaryName).GetValue(source, null);
nextSource = list[property.Substring(1)];
//property = property.Substring(1);
//nextSource = source.GetType().GetMethod("Item").Invoke(source, new[] { property });
} ...
Słownik uzyskiwany jest określony w klasie PersonObject jako takie:
public class PersonObject
{
public String Name { get; set; }
public AddressObject Address { get; set; }
public Dictionary<String, HobbyObject> Hobbies { get; set; }
Wartość ścieżki, na tym etapie jest ustawiony "*Hiking.Hobbies.Hobby"
. Zasadniczo, ciąg znaków pozwala mi przejść do właściwości w podklasie i potrzebuję Słownika, aby uzyskać dostęp do właściwości dla listy tej samej klasy.
Czy potwierdzone, że 'source.GetType() GetProperty (dictionaryName) .GetValue (source, null) 'zwraca referencję do słownika lub zwraca" null "? EDYCJA: jeśli zwraca poprawnie słownik, może po prostu użyj 'dynamic' zamiast:' dynamic list = (dynamic) source.GetType(). GetProperty (dictionaryName) .GetValue (source, null); nextSource = (obiekt) lista [klucz]; ' –
am cholernie pewne źródło ma wartość null, jeśli nie powinno to działać –
Źródło nie jest puste. Kiedy nazywam to, otrzymuję wyjątek InvalidCastException. Rzeczywisty słownik, do którego uzyskuję dostęp w tym konkretnym przykładzie, to typ. –
Tim